基于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表格处理的主要内容,如果未能解决你的问题,请参考以下文章
Apache poi 固定Excel 表格导入数据库方法(列名对应数据库字段名)