java poi 在服务器生成excel文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java poi 在服务器生成excel文件相关的知识,希望对你有一定的参考价值。

是这样的,一般来说都是利用poi导出excel,可我需要在导出excel的同时在服务器端生成一个相同的备份文件,现在我有一个写好内容的wookbook,要怎么在需要的目录下生成excel文件呢~~
我在网上查了一些方法能够生成excel,但是这个excel无法打开,说格式错误。求大神告知怎么回事,下面贴上生成excel的代码

File file=new File("E://月工数报表/"+st_id_query+"/"+type_lyj+"/"+year_query+month_query1+".xls");
if (!file.exists())
file.createNewFile();
System.err.println(file + "已创建!");


if (!file.exists())
try
HSSFWorkbook ws = new HSSFWorkbook();//建立新HSSFWorkbook对象
ws=workbook;
FileOutputStream fileOut = new FileOutputStream("文件路径");//创建文件流
ws.write(fileOut);//把Workbook对象输出到路径path中
fileOut.close();
catch (IOException e)
e.printStackTrace();

报格式错误是因为你没有填充EXCEL的内容。
正确的做法是:
1, HSSFWorkbook ws = new HSSFWorkbook();//建立新HSSFWorkbook对象
2, Sheet sheet = workbook.createSheet(0); //建立一个新的sheet
3,Row row = sheet.createRow(1); //建立一个新的row对象
4, Cell cell = row.createCell(0); //在row上创建方格即列,
cell.setCellValue(cellValue); //设置这个行中列的值
cell.setCellStyle(cellStyle); //设置样式
参考技术A 1、ws=workbook做什么的,是否有必要加
2、在ws上添加sheet
HSSFSHeep sheet = ws.createSheet();
3、HSSFRow row = sheet.createRow(0)

你可以先添加2,试试本回答被提问者采纳
参考技术B 很明显ws=workbook;这个有问题。

你给出的代码没有组织excel表格的代码。
你的这个workbook不知道是哪儿来的。

java poi 导出excel

很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告。有时,一个应用程序甚至希望将Excel文件作为输入数据。例如,一个公司开发的应用程序将财务部门需要所有输出生成自己的Excel。

任何Java程序员愿意将MS Office文件的输出,可以使用预定义和只读API来做到。

 

什么是Apache POI?

Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件。这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库。它包含类和方法对用户输入数据或文件到MS Office文档进行解码。

Apache POI组件

Apache POI包含类和方法,来将MS Office所有OLE 2文档复合。此API组件的列表如下。

  • POIFS (较差混淆技术实现文件系统) : 此组件是所有其他POI元件的基本因素。它被用来明确地读取不同的文件。

  • HSSF (可怕的电子表格格式) : 它被用来读取和写入MS-Excel文件的xls格式。

  • XSSF (XML格式) : 它是用于MS-Excel中XLSX文件格式。

  • HPSF (可怕的属性设置格式) : 它用来提取MS-Office文件属性设置。

  • HWPF (可怕的字处理器格式) : 它是用来读取和写入MS-Word的文档扩展名的文件。

  • XWPF (XML字处理器格式) : 它是用来读取和写入MS-Word的docx扩展名的文件。

  • HSLF (可怕的幻灯片版式格式) : 它是用于读取,创建和编辑PowerPoint演示文稿。

  • HDGF (可怕的图表格式) : 它包含类和方法为MS-Visio的二进制文件。

  • HPBF (可怕的出版商格式) : 它被用来读取和写入MS-Publisher文件。

本人做的事使用java poi导出excel文件。因此,仅限于HSSF组件。

ExportUtil工具类:

package net.dagongsoft.framework.util.poi;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * @description 利用Java poi导出excel公用类
 * @author ldp
 * @time 2017年6月8日 下午2:17:08
 *
 */
public class ExportUtil {

	/**
	 * 导出Excel 97(.xls)格式 ,少量数据
	 * 
	 * @param title
	 *            sheet名
	 * @param headString
	 *            列名
	 * @param jsonArray
	 *            数据集
	 */
	public static HSSFWorkbook exportExcel(String title, String headString, JSONArray jsonArray) {
		// 声明一个工作薄
		HSSFWorkbook workbook = new HSSFWorkbook();
		// 表头样式
		// HSSFCellStyle titleStyle = workbook.createCellStyle();
		// titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// HSSFFont titleFont = workbook.createFont();
		// titleFont.setFontHeightInPoints((short) 20);
		// titleFont.setBoldweight((short) 700);
		// titleStyle.setFont(titleFont);
		// 列头样式
		HSSFCellStyle headerStyle = workbook.createCellStyle();
		// headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		// headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		// headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		// headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// HSSFFont headerFont = workbook.createFont();
		// headerFont.setFontHeightInPoints((short) 12);
		// headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		// headerStyle.setFont(headerFont);
		// 单元格样式
		HSSFCellStyle cellStyle = workbook.createCellStyle();
		// cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		// cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		// cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		// cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		// cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		// HSSFFont cellFont = workbook.createFont();
		// cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
		// cellStyle.setFont(cellFont);
		// 生成一个表格
		HSSFSheet sheet = null;
		if (StringUtils.isNotBlank(title)) {
			sheet = workbook.createSheet(title);
		} else {
			sheet = workbook.createSheet();
		}
		String[] headers = headString.split(",");

		// 遍历集合数据,产生数据行
		int rowIndex = 0;
		int count = 0;
		if (jsonArray != null) {
			for (int n = 0; n < jsonArray.size(); n++) {
				if (rowIndex == 65535 || rowIndex == 0) {
					if (rowIndex != 0) {
						count++;
						// 如果数据超过了,则在第二页显示
						if (StringUtils.isNotBlank(title)) {
							sheet = workbook.createSheet(title + count);
						} else {
							sheet = workbook.createSheet();
						}
					}
					HSSFRow headerRow = sheet.createRow(0); // 列头 rowIndex =0
					for (int i = 0; i < headers.length; i++) {
						headerRow.createCell(i).setCellValue(headers[i]);
						headerRow.getCell(i).setCellStyle(headerStyle);
					}
					rowIndex = 1;// 数据内容从 rowIndex=1开始
				}
				JSONObject jo = jsonArray.getJSONObject(n);
				HSSFRow dataRow = sheet.createRow(rowIndex);
				for (int i = 0; i < headers.length; i++) {
					HSSFCell newCell = dataRow.createCell(i);
					Object o = jo.get(headers[i]);
					String cellValue = "";
					if (o == null) {
						cellValue = "";
					} else if (o instanceof Date) {
						cellValue = new SimpleDateFormat("yyyy/MM/dd 00:00:00").format(o);
					} else {
						cellValue = o.toString();
					}
					newCell.setCellValue(cellValue);
					newCell.setCellStyle(cellStyle);
				}
				rowIndex++;
			}
		}
		// 自动调整宽度
		for (int i = 0; i < headers.length; i++) {
			sheet.autoSizeColumn(i);
		}
		return workbook;
	}
}

  控制类:

package net.dagongsoft.platform.poi.controller;

import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.fastjson.JSONArray;

import net.dagongsoft.platform.poi.entity.Student;
import net.dagongsoft.platform.poi.service.StudentExportService;
import net.dagongsoft.platform.poi.util.ExportUtilTest;

@Controller
@RequestMapping("/studentExportController")
public class StudentExportController {

	@Autowired
	private StudentExportService studentExportService;

	@RequestMapping("/export.form")
	public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {

		List<Student> list = new ArrayList<Student>();
		list.add(new Student(1000, "zhangsan", "20"));
		list.add(new Student(1001, "lisi", "23"));
		list.add(new Student(1002, "wangwu", "25"));
		HSSFWorkbook wb = studentExportService.export(list);
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-disposition", "attachment;filename=student.xls");
		OutputStream ouputStream = response.getOutputStream();
		wb.write(ouputStream);
		ouputStream.flush();
		ouputStream.close();
	}
}

  serivice接口声明:

package net.dagongsoft.platform.poi.service;

import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import net.dagongsoft.platform.poi.entity.Student;

public interface StudentExportService {

	HSSFWorkbook export(List<Student> list);

}

  service实现类:

package net.dagongsoft.platform.poi.service.impl;

import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.stereotype.Service;

import net.dagongsoft.platform.poi.entity.Student;
import net.dagongsoft.platform.poi.service.StudentExportService;
@Service
public class StudentExportServiceImpl implements StudentExportService {

	String[] excelHeader = { "Id", "Name", "Age" };

	@Override
	public HSSFWorkbook export(List<Student> list) {
		HSSFWorkbook wb = new HSSFWorkbook();
		HSSFSheet sheet = wb.createSheet("Student");
		HSSFRow row = sheet.createRow((int) 0);
		HSSFCellStyle style = wb.createCellStyle();

		for (int i = 0; i < excelHeader.length; i++) {
			HSSFCell cell = row.createCell(i);
			cell.setCellValue(excelHeader[i]);
			cell.setCellStyle(style);
			sheet.autoSizeColumn(i);
			// sheet.SetColumnWidth(i, 100 * 256);
		}

		for (int i = 0; i < list.size(); i++) {
			row = sheet.createRow(i + 1);
			Student student = list.get(i);
			row.createCell(0).setCellValue(student.getId());
			row.createCell(1).setCellValue(student.getName());
			row.createCell(2).setCellValue(student.getAge());
		}
		return wb;
	}
	
	

}

  

以上是关于java poi 在服务器生成excel文件的主要内容,如果未能解决你的问题,请参考以下文章

java poi操作Excel文件 生成的Excel文件为里面的内容为只读,不可以修改其内容。求解答。

Java基础系列19:使用JXL或者POI生成和解析Excel文件

poi excel如何用java代码生成

java使用poi生成Excel文件

java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的

java 数据导入到exc ,并下载