POI HSS 合并重复的列
程序员文章站
2023-01-11 18:11:02
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.List; im... ......
import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.ioexception; import java.util.hashmap; import java.util.list; import java.util.map; import org.apache.poi.hssf.usermodel.hssfcell; import org.apache.poi.hssf.usermodel.hssfcellstyle; import org.apache.poi.hssf.usermodel.hssffont; import org.apache.poi.hssf.usermodel.hssfrow; import org.apache.poi.hssf.usermodel.hssfsheet; import org.apache.poi.hssf.usermodel.hssfworkbook; import org.apache.poi.hssf.util.region; import org.apache.poi.ss.usermodel.font; import org.apache.poi.ss.util.cellrangeaddress; import org.hibernate.sqlquery; import org.hibernate.transform.transformers; import org.jboss.seam.annotations.name; import org.jboss.seam.annotations.remoting.webremote; import com.sunsheen.jfids.system.base.composite.data.query.queryparameterimpl; import com.sunsheen.jfids.system.database.dbsession; import com.sunsheen.jfids.util.databaseutil; public class salarypoi { @suppresswarnings("deprecation") public string gettoexcel(){ ......省略数据源获取 // 返回表单结果集 list list = query.list(); int size = list.size(); system.out.println("+++++++++++++" + size); //初始化poi //创建工作簿---->xssf代表10版的excel(hssf是07版前的excel) hssfworkbook wb = new hssfworkbook(); //工作表 hssfsheet sheet = wb.createsheet("淞幸科技"); //标头行,代表第一行 hssfrow head=sheet.createrow(0); hssfcell hssfcell=head.createcell(0); hssfcell.setcellvalue("成都淞幸科技有限责任公司"+date.substring(0,4)+"年"+ date.substring(date.length()-2,date.length())+"月工资表"); head.setheightinpoints(70); //合并第一行的单元格 cellrangeaddress address=new cellrangeaddress(0,0,0,26); sheet.addmergedregion(address); //创建字体与风格 hssfcellstyle cellstyle = wb.createcellstyle();//生成表头格样式 hssffont hssffont = wb.createfont();//创建字体 hssffont.setfontheightinpoints((short)12);//字体大小 hssffont.setboldweight(font.boldweight_bold);//粗体 cellstyle.setalignment(hssfcellstyle.align_center);//水平居中 cellstyle.setverticalalignment(hssfcellstyle.vertical_center);//垂直居中 cellstyle.setfont(hssffont); hssfcell.setcellstyle(cellstyle); //修饰风格2 hssfcellstyle cellstyle2 = wb.createcellstyle();//生成表头格样式 cellstyle2.setalignment(hssfcellstyle.align_center);//水平居中 cellstyle2.setverticalalignment(hssfcellstyle.vertical_center);//垂直居中 hssfrow header=sheet.createrow(1); //创建单元格,0代表第一行第一列 string[] heards ={"序号","部门名称","工号","姓名","银行卡号","定级工资","岗位工资","基础 ,"实发工资总额"......}; for(int i =0;i<heards.length;i++){ hssfcell hssfcell1=header.createcell(i); hssfcell1.setcellstyle(cellstyle2); hssfcell1.setcellvalue(heards[i]); } //设置列的宽度 // getphysicalnumberofcells()代表这行有多少包含数据的列 for(int i=0;i<header.getphysicalnumberofcells();i++){ //poi设置列宽度时比较特殊,它的基本单位是1/255个字符大小, //因此我们要想让列能够盛的下20个字符的话,就需要用255*20 sheet.setcolumnwidth(i, 255*15); } //设置行高,行高的单位就是像素,因此30就是30像素的意思 header.setheightinpoints(30); int k =2; // for(int i=0;i<size;i++){ // //创建多行数据 hssfrow headers=sheet.createrow(k++); // //拿出所有查询出的一条list(list(map<>))信息 map<string, object> map = (map<string, object>) list.get(i); system.out.println(map); string[] context ={你要写入的数据}; for(int j=0;j<context.length;j++){ hssfcell hssfcell2=headers.createcell(j); hssfcell2.setcellstyle(cellstyle2); hssfcell2.setcellvalue(context[j]); } } // 合并相同列中的数据 // 处理相同的数据合并单元格 if(sheet.getlastrownum()>2){//获取最后一行行标,比行数小 满足合并的条件,2是数据行的开始,0 1 行为表头 hssfrow row_1 = sheet.getrow(2); hssfcell cell_1 = row_1.getcell(1); string departname = cell_1.getstringcellvalue(); for(int i=3;i<=sheet.getlastrownum();i++){ //除第一个外,循环将内容相同的单元格设为"",这里体现出为什么原数据要有序! hssfrow rows = sheet.getrow(i); //此处表示对单元格进行内容相同合并处理,我这里获取的是每行的第2列进行对比,要多列对比的,这里自行增加 hssfcell cells_1 = rows.getcell(1); //这里值相同则设置位空,方便之后的合并 if(departname.equals(cells_1.getstringcellvalue())){ cells_1.setcellvalue(""); }else{ departname = cells_1.getstringcellvalue(); } } } int sk; if(sheet.getlastrownum()>2){//将为空的单元格与之前不为空的合并 sk=2; for(int i=3;i<=sheet.getlastrownum();i++){ hssfrow rows = sheet.getrow(i); hssfcell cell_0 = rows.getcell(1); if(cell_0.getstringcellvalue() == ""){//如果为空但还没对比到最后一行,继续循环 if(i==sheet.getlastrownum()){ sheet.addmergedregion(new cellrangeaddress(sk, i, 1, 1));//如果已经对比到最后一行,开始合并 } }else{ if(sk != i-1){//不为空且i-1不为sk则合并 sheet.addmergedregion(new cellrangeaddress(sk, i-1, 1, 1));//起始行号,终止行号, 起始列号,终止列号 } sk =i; } } } //上面设置好了内容,我们当然是要输出到某个文件的,输出就需要有输出流 fileoutputstream fos; try { fos = new fileoutputstream("d:/2010.xls"); //向指定文件写入内容 wb.write(fos); fos.close(); return "导出excel已完成!"; } catch (filenotfoundexception e) { // todo 自动生成的 catch 块 e.printstacktrace(); } catch (ioexception e) { // todo 自动生成的 catch 块 e.printstacktrace(); } return "导出excel失败!"; } }
上一篇: Java http请求工具类
下一篇: 早会的时候
推荐阅读
-
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
-
mysql 列转行,合并字段的方法(必看)
-
用python查找excel里面的某一列的重复数据,剔除之后打印
-
python实现查找excel里某一列重复数据并且剔除后打印的方法
-
Excel中实现跨行合并把备注列扩展到K列的快速方法
-
Oracle列转行函数Listagg()查询结果的去重(去除重复值)的方法详解
-
ASP.NET中GridView 重复表格列合并的实现方法
-
使用=号引用的方法来将Excel中多列内容合并成一列
-
jQuery实现合并/追加数组并去除重复项的方法 原创
-
python中查找excel某一列的重复数据 剔除之后打印