POI HSS 合並重復的列



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失敗!"; } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM