POI导出Excel
2015-09-02 11:43
453 查看
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
如,生成这样一个Excel
![](http://img.blog.csdn.net/20150902113956899)
ps:上面这段代码在一个Excel中只包含一个sheet的情况下没有问题,但当你想导出一个包含多个sheet的Excel时会出现,sheet创建不成功
结构:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
如,生成这样一个Excel
// 1.声明一个工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); // 2.生成一个表格 HSSFSheet sheet = workbook.createSheet(title); // 3.设置表格默认宽度为15个字节 sheet.setDefaultColumnWidth(8); // 4.生成一个样式 HSSFCellStyle styleRemark = workbook.createCellStyle(); // 设置这些样式 styleRemark.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 生成一个字体 HSSFFont fontRemark = workbook.createFont(); fontRemark.setFontHeightInPoints((short) 11); fontRemark.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); fontRemark.setColor(HSSFColor.BLACK.index); fontRemark.setFontName("宋体"); // 把字体 应用到当前样式 styleRemark.setFont(fontRemark); // 5.产生表格标题行 HSSFRow rowTit = sheet.createRow(2); HSSFCell cellTit = rowTit.createCell(0); cellTit.setCellValue("请假记录"); cellTit.setCellStyle(styleTitle); sheet.addMergedRegion(new Region(2, (short) 0, 2, (short) (headerNames.length - 1)));//合并单元格 // 6.产生表格表头行 /*headerNames为一个存放表头内容的数组 String [] headerNames = {"月度","姓名","所属项目","人员性质","年休假","3天以内病假","3天到6个月病假","6个月以上病假","事假","婚假","丧假","产假","迟到早退","旷工","非法定节假日加班","国家法定节假日加班天数","倒休","事假扣款","请假汇总天数","备注"}; */ HSSFRow row = sheet.createRow(3); for (int i = 0; i < headerNames.length; i++) { HSSFCell cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headerNames[i]); System.out.println(text); cell.setCellValue(text); cell.setCellStyle(StyleFont(workbook, i + 1, 0)); } // 7.遍历集合数据,产生数据行 /*dataSet为数据行内容 List<Ptleavesum> dataSet = new ArrayList<Ptleavesum>(); Ptleavesum pt = new Ptleavesum(); pt.setUsercode("7265"); …… */ Iterator<T> it = dataSet.iterator(); int index = 3; while (it.hasNext()) { index++; row = sheet.createRow(index); T t = (T) it.next(); // 利用反射机制,根据javabean属性的先后顺序,动态调用getX()方法得到属性值 Field[] fields = t.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; String fieldName = field.getName(); /*在写这段代码时,出现了表头字段与数据行错位现象,即,数据没有放到对应的位置上,注意创建createCell与setCellValue不要放错值,这里用取到的属性值与表头去比较,如果一样就创建cell并把获得的属性值放进去。 这里headerIds存放的是与表头顺序一致的与get方法名称相同的数组,比如获取姓名,getUsername()所以存username String [] headerNames = {"月度","姓名","所属项目","人员性质","年休假","3天以内病假","3天到6个月病假","6个月以上病假","事假","婚假","丧假","产假","迟到早退","旷工","非法定节假日加班","国家法定节假日加班天数","倒休","事假扣款","请假汇总天数","备注"}; String [] headerIds = {"yearmonth","username","projectcode","usertype","annualleave","thressickleave","sixmonthsick","uppersixmonthsick","businessleave","marriageleave","funeralleave","maternityleave","tardiness","truancy","overtime","legalovertime","timeoff","deduction","sumleave","remark"}; */ for(int j=0;j<headerIds.length;j++){ if (fieldName.equals(headerIds[j])) { String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); System.out.println("getMethodName-----" + getMethodName); System.out.println("headerIds==="+headerIds[j]); Class tClass = t.getClass(); try { Method getMethod = tClass.getMethod(getMethodName,new Class[] {}); Object value = getMethod.invoke(t, new Object[] {}); System.out.println("value================>" + value); // 判断值类型后进行强制类型转换 String textValue = null; if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat( pattern); textValue = sdf.format(date); } else { if (value != null) { textValue = value.toString(); } else { textValue = ""; } } HSSFCell cell = row.createCell(j); cell.setCellValue(textValue); cell.setCellStyle(StyleFont(workbook, j + 1, 1)); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } try { //out:传过来的值OutputStream out = new FileOutputStream("F://月报表.xls"); workbook.write(out); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
ps:上面这段代码在一个Excel中只包含一个sheet的情况下没有问题,但当你想导出一个包含多个sheet的Excel时会出现,sheet创建不成功
// 创建sheet,workbook为共有一个,如下: public void exportExcel(HSSFWorkbook workbook, int idx, String title, Map<Integer, String> remarkMap, String[] headerNames, String[] headerIds, Collection<T> dataSet, String filePath, String pattern) { // 记录行号 int rowNum = 0; // 创建sheet HSSFSheet sheet = workbook.createSheet(); workbook.setSheetName(sheetIdx++, title); …… …… //当向文件中写入时注意,不能向上边代码共用一个OutputStream,需要如下才能实现多sheet导出。 try { OutputStream out = new FileOutputStream(filePath); workbook.write(out); out.close(); } catch (IOException e) { e.printStackTrace(); }
相关文章推荐
- android性能优化--overdraw优化
- 第7篇,怎样让用户容易找到你?
- 利用CORS配置实现jQuery对WebApi及MVC的跨域访问
- jquery常用函数与方法汇总
- 桥接模式 - 设计模式学习
- 迭代器模式 - 设计模式学习
- mosquitto_pub和mosquitto_sub 命令参数说明
- SVN 冲突解决
- 组合模式 - 设计模式学习
- 备忘录模式 - 设计模式学习
- Ubuntu Server 14.04.3 LTS 编译安装 NodeJS
- STM32F103RC/D/E是否可以使用mbed
- Android 查看內存使用
- 实现winfrom进度条及进度信息提示,winfrom程序假死处理
- 备忘录模式 - 设计模式学习
- 适配器模式 - 设计模式学习
- 迎金秋,老段所有课程7折优惠
- 状态模式 - 设计模式学习
- 抽象工厂模式 - 设计模式学习
- 借助HotSpot SA来一窥PermGen上的对象