经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
POI HSS 合并重复的列
来源:cnblogs  作者:wanchen  时间:2018/11/20 10:41:42  对本文有异议

  1. import
    java.io.FileNotFoundException;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.apache.poi.hssf.usermodel.HSSFCell;
  8. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  9. import org.apache.poi.hssf.usermodel.HSSFFont;
  10. import org.apache.poi.hssf.usermodel.HSSFRow;
  11. import org.apache.poi.hssf.usermodel.HSSFSheet;
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  13. import org.apache.poi.hssf.util.Region;
  14. import org.apache.poi.ss.usermodel.Font;
  15. import org.apache.poi.ss.util.CellRangeAddress;
  16. import org.hibernate.SQLQuery;
  17. import org.hibernate.transform.Transformers;
  18. import org.jboss.seam.annotations.Name;
  19. import org.jboss.seam.annotations.remoting.WebRemote;
  20. import com.sunsheen.jfids.system.base.composite.data.query.QueryParameterImpl;
  21. import com.sunsheen.jfids.system.database.DBSession;
  22. import com.sunsheen.jfids.util.DataBaseUtil;
  23. public class SalaryPoi {
  24. @SuppressWarnings("deprecation")
  25. public String getToExcel(){
  26. ......省略数据源获取
  27. // 返回表单结果集
  28. List list = query.list();
  29. int size = list.size();
  30. System.out.println("+++++++++++++" + size);
  31. //初始化POI
  32. //创建工作簿---->XSSF代表10版的Excel(HSSF是07版前的Excel)
  33. HSSFWorkbook wb = new HSSFWorkbook();
  34. //工作表
  35. HSSFSheet sheet = wb.createSheet("淞幸科技");
  36. //标头行,代表第一行
  37. HSSFRow head=sheet.createRow(0);
  38. HSSFCell hssfCell=head.createCell(0);
  39. hssfCell.setCellValue("成都淞幸科技有限责任公司"+date.substring(0,4)+"年"+
  40. date.substring(date.length()-2,date.length())+"月工资表");
  41. head.setHeightInPoints(70);
  42. //合并第一行的单元格
  43. CellRangeAddress address=new CellRangeAddress(0,0,0,26);
  44. sheet.addMergedRegion(address);
  45. //创建字体与风格
  46. HSSFCellStyle cellStyle = wb.createCellStyle();//生成表头格样式
  47. HSSFFont hssfFont = wb.createFont();//创建字体
  48. hssfFont.setFontHeightInPoints((short)12);//字体大小
  49. hssfFont.setBoldweight(Font.BOLDWEIGHT_BOLD);//粗体
  50. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
  51. cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
  52. cellStyle.setFont(hssfFont);
  53. hssfCell.setCellStyle(cellStyle);
  54. //修饰风格2
  55. HSSFCellStyle cellStyle2 = wb.createCellStyle();//生成表头格样式
  56. cellStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
  57. cellStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
  58. HSSFRow header=sheet.createRow(1);
  59. //创建单元格,0代表第一行第一列
  60. String[] heards ={"序号","部门名称","工号","姓名","银行卡号","定级工资","岗位工资","基础
  61. ,"实发工资总额"......};
  62. for(int i =0;i<heards.length;i++){
  63. HSSFCell hssfCell1=header.createCell(i);
  64. hssfCell1.setCellStyle(cellStyle2);
  65. hssfCell1.setCellValue(heards[i]);
  66. }
  67. //设置列的宽度
  68. // getPhysicalNumberOfCells()代表这行有多少包含数据的列
  69. for(int i=0;i<header.getPhysicalNumberOfCells();i++){
  70. //POI设置列宽度时比较特殊,它的基本单位是1/255个字符大小,
  71. //因此我们要想让列能够盛的下20个字符的话,就需要用255*20
  72. sheet.setColumnWidth(i, 255*15);
  73. }
  74. //设置行高,行高的单位就是像素,因此30就是30像素的意思
  75. header.setHeightInPoints(30);
  76. int k =2;
  77. //
  78. for(int i=0;i<size;i++){
  79. // //创建多行数据
  80. HSSFRow headers=sheet.createRow(k++);
  81. // //拿出所有查询出的一条list(list(Map<>))信息
  82. Map<String, Object> map = (Map<String, Object>) list.get(i);
  83. System.out.println(map);
  84. String[] context ={你要写入的数据};
  85. for(int j=0;j<context.length;j++){
  86. HSSFCell hssfCell2=headers.createCell(j);
  87. hssfCell2.setCellStyle(cellStyle2);
  88. hssfCell2.setCellValue(context[j]);
  89. }
  90. }
  91. // 合并相同列中的数据
  92. // 处理相同的数据合并单元格
  93. if(sheet.getLastRowNum()>2){//获取最后一行行标,比行数小 满足合并的条件,2是数据行的开始,0 1 行为表头
  94. HSSFRow row_1 = sheet.getRow(2);
  95. HSSFCell cell_1 = row_1.getCell(1);
  96. String departname = cell_1.getStringCellValue();
  97. for(int i=3;i<=sheet.getLastRowNum();i++){
  98. //除第一个外,循环将内容相同的单元格设为"",这里体现出为什么原数据要有序!
  99. HSSFRow rows = sheet.getRow(i);
  100. //此处表示对单元格进行内容相同合并处理,我这里获取的是每行的第2列进行对比,要多列对比的,这里自行增加
  101. HSSFCell cells_1 = rows.getCell(1);
  102. //这里值相同则设置位空,方便之后的合并
  103. if(departname.equals(cells_1.getStringCellValue())){
  104. cells_1.setCellValue("");
  105. }else{
  106. departname = cells_1.getStringCellValue();
  107. }
  108. }
  109. }
  110. int sk;
  111. if(sheet.getLastRowNum()>2){//将为空的单元格与之前不为空的合并
  112. sk=2;
  113. for(int i=3;i<=sheet.getLastRowNum();i++){
  114. HSSFRow rows = sheet.getRow(i);
  115. HSSFCell cell_0 = rows.getCell(1);
  116. if(cell_0.getStringCellValue() == ""){//如果为空但还没对比到最后一行,继续循环
  117. if(i==sheet.getLastRowNum()){
  118. sheet.addMergedRegion(new CellRangeAddress(sk, i, 1, 1));//如果已经对比到最后一行,开始合并
  119. }
  120. }else{
  121. if(sk != i-1){//不为空且i-1不为sk则合并
  122. sheet.addMergedRegion(new CellRangeAddress(sk, i-1, 1, 1));//起始行号,终止行号, 起始列号,终止列号
  123. }
  124. sk =i;
  125. }
  126. }
  127. }
  128. //上面设置好了内容,我们当然是要输出到某个文件的,输出就需要有输出流
  129. FileOutputStream fos;
  130. try {
  131. fos = new FileOutputStream("d:/2010.xls");
  132. //向指定文件写入内容
  133. wb.write(fos);
  134. fos.close();
  135. return "导出Excel已完成!";
  136. } catch (FileNotFoundException e) {
  137. // TODO 自动生成的 catch 块
  138. e.printStackTrace();
  139. } catch (IOException e) {
  140. // TODO 自动生成的 catch 块
  141. e.printStackTrace();
  142. }
  143. return "导出Excel失败!";
  144. }
  145. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号