导出Excel——POI的使用

发表时间:2017-05-16 15:55:14 浏览量( 46 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

一、POI简介

在做ERP系统时,我们也常常会遇到这样一个问题——把查询出来的数据导出成为一个Excel,想这样的功能我们又如何去完成呢?事实上这个问题涉及两个步骤

1、如何动态的生成一个Excel文件

2、如何下载这个文件。

下载文件我们之前已经介绍过了,这里重点就是如何动态生成一个Excel文件,这里我们使用POI这个类库。

POI简介

http://poi.apache.org/

Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF - 提供读写Microsoft Word DOC格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读Microsoft Visio格式档案的功能。

HPBF - 提供读Microsoft Publisher格式档案的功能。

HSMF - 提供读Microsoft Outlook格式档案的功能。

二、示例

1、导包。先把poi下载下来后,这里我使用的是poi-3.10-FINAL版本,下载后加压就可以了,打开目录就可以看到poi的核心jar包poi-3.10-FINAL-20140208.jar了,如何你想使用旧版本的Excel那么在导入lib目录下面的jar包就可以了,如果你想支持新版本的Excel,那么除了示例jar包不需要导入,建议其它的先都导入,包括ooxml-lib目录下的jar包,doc文件是示例文件。如下图:


2、你可以打开doc目录,在主页index.html页面找到对Excel讲解,里面有相关的例子。你可以拷贝其中一个示例参考一下,事实上生成一个Excel是非常简单,可以看看最新的对2007版本的Excel的支持。先使用main方法测试POI的功能,新建一个Test类,在main方法中把示例代码复制过来。

这个示例演示了如何生成新版和旧版的Excel,真实项目只需要使用其中的一个就可以了。其实生成Execl非常简单,先定义一个Workbook工作薄,然后定义sheet,在定义行,再一格一格的添加内容,当然你还可以修改一下字体,颜色等等一些设置。原来的示例有点错误,我修改了一下,同时把生成的Excel定义在D盘中,完整代码如下:

public class Test {
	public static void main(String[] args) throws IOException {
		
		
		Workbook[] wbs = new Workbook[] { new HSSFWorkbook(),
				new XSSFWorkbook() };
		for (int i = 0; i < wbs.length; i++) {
			Workbook wb = wbs[i];
			CreationHelper createHelper = wb.getCreationHelper();

			// create a new sheet
			Sheet s = wb.createSheet();
			// declare a row object reference
			Row r = null;
			// declare a cell object reference
			Cell c = null;
			// create 2 cell styles
			CellStyle cs = wb.createCellStyle();
			CellStyle cs2 = wb.createCellStyle();
			DataFormat df = wb.createDataFormat();

			// create 2 fonts objects
			Font f = wb.createFont();
			Font f2 = wb.createFont();

			// Set font 1 to 12 point type, blue and bold
			f.setFontHeightInPoints((short) 12);
			f.setColor(IndexedColors.RED.getIndex());
			f.setBoldweight(Font.BOLDWEIGHT_BOLD);

			// Set font 2 to 10 point type, red and bold
			f2.setFontHeightInPoints((short) 10);
			f2.setColor(IndexedColors.RED.getIndex());
			f2.setBoldweight(Font.BOLDWEIGHT_BOLD);

			// Set cell style and formatting
			cs.setFont(f);
			cs.setDataFormat(df.getFormat("#,##0.0"));

			// Set the other cell style and formatting
			cs2.setBorderBottom(cs2.BORDER_THIN);
			cs2.setDataFormat(df.getFormat("text"));
			cs2.setFont(f2);

			// Define a few rows
			for (int rownum = 0; rownum < 30; rownum++) {
				Row r1 = s.createRow(rownum);
				for (int cellnum = 0; cellnum < 10; cellnum += 2) {
					Cell c1 = r1.createCell(cellnum);
					Cell c2 = r1.createCell(cellnum + 1);

					c1.setCellValue((double) rownum + (cellnum / 10));
					c2.setCellValue(createHelper.createRichTextString("Hello! "
							+ cellnum));
				}
			}

			// Save
			String filename = "d://workbook.xls";
			if (wb instanceof XSSFWorkbook) {
				filename = filename + "x";
			}

			FileOutputStream out = new FileOutputStream(filename);
			wb.write(out);
			out.close();
		}
	}
}

运行上面的代码,然后打开D盘就可以看到生成了两个Excel文件。打开看看里面已经有内容的了。

3、完成下载这个文件。

既然我们可以生成文件,那么结合struts2,我们做一个导出Excel的功能演示,首先你需要先把struts2的框架先搭建好,然后简单的做一个用户的列表,在隔壁有一个导出操作,如下面所示。功能比较简单给出代码了,我们需要完成的是这个导出的Action功能。

private InputStream mydoc;// 用于下载的输入流
	private String downfilename;// 下载文件名称
	// 先在服务器中生成excel
	// 下载这个excel
	// 文件下载
	public InputStream getMydoc() {

		List<Employee> employees = employeeBiz.getAll();

		// 先在服务器中生成excel
		// 建立一个2003版本之前的excel
		Workbook wb = new HSSFWorkbook();
		CreationHelper createHelper = wb.getCreationHelper();

		// create a new sheet
		Sheet s = wb.createSheet();
		// declare a row object reference
		Row r = null;
		// declare a cell object reference
		Cell c = null;
		// create 2 cell styles
		CellStyle cs = wb.createCellStyle();
		CellStyle cs2 = wb.createCellStyle();
		DataFormat df = wb.createDataFormat();

		// create 2 fonts objects
		Font f = wb.createFont();
		Font f2 = wb.createFont();

		// Set font 1 to 12 point type, blue and bold
		f.setFontHeightInPoints((short) 12);
		f.setColor(IndexedColors.RED.getIndex());
		f.setBoldweight(Font.BOLDWEIGHT_BOLD);

		// Set font 2 to 10 point type, red and bold
		f2.setFontHeightInPoints((short) 10);
		f2.setColor(IndexedColors.RED.getIndex());
		f2.setBoldweight(Font.BOLDWEIGHT_BOLD);

		// Set cell style and formatting
		cs.setFont(f);
		cs.setDataFormat(df.getFormat("#,##0.0"));

		// Set the other cell style and formatting
		cs2.setBorderBottom(cs2.BORDER_THIN);
		cs2.setDataFormat(df.getFormat("text"));
		cs2.setFont(f2);

		Row tr1 = s.createRow(0);

		Cell tc1 = tr1.createCell(0);
		Cell tc2 = tr1.createCell(1);

		tc1.setCellValue("姓名");
		tc2.setCellValue("地址");

		// Define a few rows
		for (int rownum = 0; rownum < employees.size(); rownum++) {

			Employee employee = employees.get(rownum);

			Row r1 = s.createRow(rownum + 1);

			Cell c1 = r1.createCell(0);
			Cell c2 = r1.createCell(1);

			c1.setCellValue(employee.getEmployeeName());
			c2.setCellValue(employee.getAddr());

		}

		String path = ServletActionContext.getServletContext().getRealPath(
				"doc");
		// Save
		String filename = path + "//workbook.xls";

		try {
			FileOutputStream out = new FileOutputStream(filename);
			wb.write(out);
			out.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// 中文编码处理
		try {
			downfilename = new String("家庭作业".getBytes(), "iso-8859-1");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return ServletActionContext.getServletContext().getResourceAsStream(
				"doc/workbook.xls");
	}


对应的配置代码:

	<action name="down" class="com.action.EmployeeAction">
			<result name="success" type="stream">
				<param name="inputName">mydoc</param>
				<param name="contentDisposition">attachment;filename="${downfilename}.xls"</param>
				<param name="bufferSize">1024</param>
			</result>
		</action>

运行项目,点击导出文件就可以看到下载的Excel文件,如下图:

attcontent/45d0fcc4-9ffd-4d64-8c51-8a855b894153.png