基于Apache POI的Excel表格处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Apache POI的Excel表格处理相关的知识,希望对你有一定的参考价值。

参考技术A

  通过apache 的poi方法完成excel的读写,cell数据读写等常规操作,支持xls xlsx表格格式。

  需要添加依赖的jar资源,具体如下:

  xls格式的excel 表格需要通过HSSFWorkbook加载,而xlsx格式的excel表格需要XSSFWorkbook表格加载,获取WorkBook对象实例,这个实例对象就是表格文件的对象,具体为:

  上面不同后缀的文件操作方法有所区分,分为两类,xls表格对应的HSSFWorkbook类方法,xlsx对应的XSSFWorkbook类方法,操作过程基本类似,下面以HSSFWorkbook为例进行讲述。( xls,xlsx只要获取到wb后,如果没有特别的处理操作,后续采用这两种方法的任一种都是可以进行表格数据处理,可以不做区分

补充:获取wb后,wb提供的方法有很多,包括创建表格createSheet,获取表格名称getSheetName等等,具体根据自己需求使用。

 正常来说,每个Excel文件都会有多个sheet表格,比如Sheet1,Sheet2,Sheet3等等,我们通过第一步获取的wb对象,就可以轻松的拿到Excel表格的实例对象,方法两种,可以根据Excel表格的index序号获取,也可以通过Excel表格的名字获取,具体如下:

补充:sheet对象同样提供了用于操作本表格的很多方法,包括行列读写,新填行列等等所有表格相关的操作内容。

  上一步获取了sheet对象,我们就可以获取具体的行列数据了。

通过上述cell对象我们就可以获得具体的内容了,包括内容格式等等详细信息。

单元格读取方式根据其类型有所不同,具体如下所示。

如果想给新添加的Cell设置个字体格式及颜色啥的,也是可以的,比如把刚新建的Cell字体设为红色,具体如下:

  上面步骤,只是对于表格数据的处理,但实际上并没有保存到文件,如果此时就结束,那表格文件里的数据其实是没有更改,一定要记得最后要保存到表格哦~,具体如下:

  到此,基本的表格读写处理已经基本完成了,Poi的方法库其实有很多操作,这里只是简单介绍的基本的读写,如果你想修改表格字体等等,都是可以实现的哦,赶紧动手试试吧。

本程序Gitee源码地址: https://gitee.com/carmanshaw/excelpoi-master.git
开发的表格处理小工具地址: https://gitee.com/carmanshaw/ExcelProcessor.git

Java 利用poi生成excel表格

所需jar包,如下所示

 

 

写一个excel工具类 ExcelUtils .java

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelUtils {
	/**
	 * 导出excel
	 * @param headerName (excel列名称)
	 * @param headerKey (导出对象属性名)
	 * @param sheetName (excel 页签名称)
	 * @param dataList (导出的数据)
	 * @return
	 */
	public static HSSFWorkbook createExcel(String[] headerName, String[] headerKey, String sheetName, List dataList) {
		try {
			if (headerKey.length <= 0) {
				return null;
			}
			if (dataList.size() <= 0) {
				return null;
			}
			HSSFWorkbook wb = new HSSFWorkbook();
			HSSFSheet sheet;
			if ((sheetName == null) || (sheetName.equals("")))
				sheet = wb.createSheet("Sheet1");
			else {
				sheet = wb.createSheet(sheetName);
			}
			HSSFRow row = sheet.createRow(0);
			HSSFCellStyle style = wb.createCellStyle();
			style.setAlignment((short)2);
			HSSFCell cell = null;
			if (headerName.length > 0) {
				for (int i = 0; i < headerName.length; i++) {
					cell = row.createCell(i);
					cell.setCellValue(headerName[i]);
					cell.setCellStyle(style);
					
				}
			}
			int n = 0;
			HSSFCellStyle contextstyle = wb.createCellStyle();
			contextstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00_);(#,##0.00)"));

			HSSFCellStyle contextstyle1 = wb.createCellStyle();
			HSSFDataFormat format = wb.createDataFormat();
			contextstyle1.setDataFormat(format.getFormat("@"));

			HSSFCell cell0 = null;
			HSSFCell cell1 = null;

			for (Iterator localIterator = dataList.iterator(); localIterator.hasNext();) {
				Object obj = localIterator.next();
				Field[] fields = obj.getClass().getDeclaredFields();
				row = sheet.createRow(n + 1);
				for (int j = 0; j < headerKey.length; j++) {
					if (headerName.length <= 0) {
						cell0 = row.createCell(j);
						cell0.setCellValue(headerKey[j]);
						cell0.setCellStyle(style);
						
					}
					for (int i = 0; i < fields.length; i++) {
						if (fields[i].getName().equals(headerKey[j])) {
							fields[i].setAccessible(true);
							if (fields[i].get(obj) == null) {
								row.createCell(j).setCellValue("");
								break;
							}
							if ((fields[i].get(obj) instanceof Number)) {
								cell1 = row.createCell(j);
								cell1.setCellType(0);
								cell1.setCellStyle(contextstyle);
								cell1.setCellValue(Double.parseDouble(fields[i].get(obj).toString()));
								break;
							}
							if ("".equals(fields[i].get(obj))) {
								cell1 = row.createCell(j);
								cell1.setCellStyle(contextstyle1);
								row.createCell(j).setCellValue("");
								cell1.setCellType(1);
								break;
							}
							row.createCell(j).setCellValue(fields[i].get(obj).toString());
							break;
						}

					}
				}
				n++;
			}
			for (int i = 0; i < headerKey.length; i++) {
				sheet.setColumnWidth(i, headerKey[i].getBytes().length*2*256);
			}
			HSSFWorkbook localHSSFWorkbook1 = wb;
			return localHSSFWorkbook1;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
		}
	}
}

  

添加一个vo,studentVo.java

public class StudentVo {
	private int id;
	
	private String sex;
	
	private String name;
	
	private String grade;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGrade() {
		return grade;
	}

	public void setGrade(String grade) {
		this.grade = grade;
	}
}

 

在controller类中添加导出excel接口,如下所示

/**
	 * 国网数据导出
	 * @param request
	 * @param response
	 */
	@RequestMapping("/exportGWDataManageList")
	public void exportGWDataManageList(HttpServletRequest request, HttpServletResponse response){
		try{
			List<StudentVo> voList = new ArrayList<StudentVo>();
			StudentVo vo = new StudentVo();
			vo.setId("1");
			vo.setSex("男");
			vo.setName("张三");
			vo.setGrade("二年级");
			voList.add(vo);
			
			vo = new StudentVo();
			vo.setId("2");
			vo.setSex("女");
			vo.setName("李四");
			vo.setGrade("一年级");
			voList.add(vo);
			
			vo = new StudentVo();
			vo.setId("3");
			vo.setSex("男");
			vo.setName("王五");
			vo.setGrade("三年级");
			voList.add(vo);
			
			String[] headerName = { "序号","性别", "姓名", "年级"};
			String[] headerKey = { "id","sex", "name", "grade"};
			HSSFWorkbook wb = ExcelUtils.createExcel(headerName, headerKey, "年数据管理", voList);
			if (wb == null) {
				return;
			}
			response.setContentType("application/vnd.ms-excel");
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			Date date = new Date();
			String str = sdf.format(date);
			String fileName = "学生信息管理" + str;
			response.setHeader("Content-disposition",
					"attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO-8859-1") + ".xls");
			OutputStream ouputStream = response.getOutputStream();
			ouputStream.flush();
			wb.write(ouputStream);
			ouputStream.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

  

 页面只有一个生成excel按钮,如下所示

点击按钮生成excel,内容如下所示

 

以上是关于基于Apache POI的Excel表格处理的主要内容,如果未能解决你的问题,请参考以下文章

POI 操作 excel表格 (简单整理)

Apache poi 固定Excel 表格导入数据库方法(列名对应数据库字段名)

Java 利用poi生成excel表格

java如何导出excel表格,如果用poi,java代码如何实现.,求代码!!!

poi与excel表格数据的互转

java用poi读取Excel表格中的数据