java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel示例
介紹
POI提供API給Java程序?qū)icrosoft Office格式檔案讀和寫的功能。POI可以操作的文檔格式有excel,word,powerpoint等,POI進(jìn)行跨行需要用到對(duì)象HSSFSheet對(duì)象,現(xiàn)在就當(dāng)我們程序已經(jīng)定義了一個(gè)HSSFSheet對(duì)象sheet。
跨第1行第1個(gè)到第2個(gè)單元格的操作為
sheet.addMergedRegion(new Region(0,(short)0,0,(short)1));
跨第1行第1個(gè)到第2行第1個(gè)單元格的操作為
sheet.addMergedRegion(new Region(0,(short)0,1,(short)0));
重點(diǎn)注意事項(xiàng):
1.單元格CELL和ROW對(duì)象下標(biāo)都是從0開始的。
2.單元格合并時(shí)Region(1,2,3,4)第1個(gè)值的行號(hào)必須要比3位置的行號(hào)小,如果大于3就不能正常合并單元格
3.合并單元格的時(shí)候要合并的單單元格必須先創(chuàng)建,這樣方便后面再次獲取這個(gè)單元格來填充數(shù)據(jù),主要就是因?yàn)楹喜r(shí)不能由后向前進(jìn)行合并引起的。
示例代碼
import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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; public class ExcelTest { /** * @param args */ public static void main(String[] args) throws IOException { try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("new sheet"); HSSFCellStyle style = wb.createCellStyle(); // 樣式對(duì)象 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平 HSSFRow row = sheet.createRow((short) 0); HSSFRow row2 = sheet.createRow((short) 1); sheet.addMergedRegion(new Region(0, (short) 0, 1, (short) 0)); HSSFCell ce = row.createCell((short) 0); ce.setEncoding(HSSFCell.ENCODING_UTF_16);// 中文處理 ce.setCellValue("項(xiàng)目\\日期"); // 表格的第一行第一列顯示的數(shù)據(jù) ce.setCellStyle(style); // 樣式,居中 int num = 0; for (int i = 0; i < 9; i++) { // 循環(huán)9次,每一次都要跨單元格顯示 // 計(jì)算從那個(gè)單元格跨到那一格 int celln = 0; int celle = 0; if (i == 0) { celln = 0; celle = 1; } else { celln = (i * 2); celle = (i * 2 + 1); } // 單元格合并 // 四個(gè)參數(shù)分別是:起始行,起始列,結(jié)束行,結(jié)束列 sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0, (short) (celle + 1))); HSSFCell cell = row.createCell((short) (celln + 1)); cell.setCellValue("merging" + i); // 跨單元格顯示的數(shù)據(jù) cell.setCellStyle(style); // 樣式 // 不跨單元格顯示的數(shù)據(jù),如:分兩行,上一行分別兩格為一格,下一行就為兩格,“數(shù)量”,“金額” HSSFCell cell1 = row2.createCell((short) celle); HSSFCell cell2 = row2.createCell((short) (celle + 1)); cell1.setEncoding(HSSFCell.ENCODING_UTF_16); cell1.setCellValue("數(shù)量"); cell1.setCellStyle(style); cell2.setEncoding(HSSFCell.ENCODING_UTF_16); cell2.setCellValue("金額"); cell2.setCellStyle(style); num++; } // 在后面加上合計(jì)百分比 // 合計(jì) 在最后加上,還要跨一個(gè)單元格 sheet.addMergedRegion(new Region(0, (short) (2 * num + 1), 0, (short) (2 * num + 2))); HSSFCell cell = row.createCell((short) (2 * num + 1)); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue("合計(jì)"); cell.setCellStyle(style); HSSFCell cell1 = row2.createCell((short) (2 * num + 1)); HSSFCell cell2 = row2.createCell((short) (2 * num + 2)); cell1.setEncoding(HSSFCell.ENCODING_UTF_16); cell1.setCellValue("數(shù)量"); cell1.setCellStyle(style); cell2.setEncoding(HSSFCell.ENCODING_UTF_16); cell2.setCellValue("金額"); cell2.setCellStyle(style); // 百分比 同上 sheet.addMergedRegion(new Region(0, (short) (2 * num + 3), 0, (short) (2 * num + 4))); HSSFCell cellb = row.createCell((short) (2 * num + 3)); cellb.setEncoding(HSSFCell.ENCODING_UTF_16); cellb.setCellValue("百分比"); cellb.setCellStyle(style); HSSFCell cellb1 = row2.createCell((short) (2 * num + 3)); HSSFCell cellb2 = row2.createCell((short) (2 * num + 4)); cellb1.setEncoding(HSSFCell.ENCODING_UTF_16); cellb1.setCellValue("數(shù)量"); cellb1.setCellStyle(style); cellb2.setEncoding(HSSFCell.ENCODING_UTF_16); cellb2.setCellValue("金額"); cellb2.setCellStyle(style); /***這里是問題的關(guān)鍵,將這個(gè)工作簿寫入到一個(gè)流中就可以輸出相應(yīng)的名字,這里需要寫路徑就ok了。 FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); **/ /**第二種是輸出到也面中的excel名稱 * pName="欄目統(tǒng)計(jì)表"; response.reset(); response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition","attachment; filename="+new String(pName.getBytes("gb2312"),"ISO-8859-1")+".xls"); ServletOutputStream outStream=null; try{ outStream = response.getOutputStream(); wb.write(outStream); }catch(Exception e) { e.printStackTrace(); }finally{ outStream.close(); } * */ System.out.print("OK"); } catch (Exception ex) { ex.printStackTrace(); } } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java實(shí)現(xiàn)List反轉(zhuǎn)的方法總結(jié)
在Java中,反轉(zhuǎn)一個(gè)List意味著將其元素的順序顛倒,使得第一個(gè)元素變成最后一個(gè),最后一個(gè)元素變成第一個(gè),依此類推,這一操作在處理數(shù)據(jù)集合時(shí)非常有用,所以本文給大家總結(jié)了Java實(shí)現(xiàn)List反轉(zhuǎn)的方法,需要的朋友可以參考下2024-04-04SpringBoot項(xiàng)目里集成Hibernate的示例
在Spring Boot項(xiàng)目中,集成Hibernate可以幫助我們更輕松地進(jìn)行數(shù)據(jù)庫(kù)操作,本文將介紹如何在Spring Boot項(xiàng)目中集成Hibernate,并提供相應(yīng)的示例,感興趣的朋友跟隨小編一起看看吧2023-04-04win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效
這篇文章主要介紹了win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SpringBoot使用Validation校驗(yàn)參數(shù)的詳細(xì)過程
這篇文章主要介紹了SpringBoot使用Validation校驗(yàn)參數(shù),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09Java Morris遍歷算法及其在二叉樹中的應(yīng)用
Morris遍歷是一種基于線索二叉樹的遍歷算法,可以在不使用?;蜻f歸的情況下,實(shí)現(xiàn)二叉樹的前序、中序和后序遍歷。該算法利用二叉樹中的空指針或線索指針,將遍歷序列嵌入到原二叉樹中,實(shí)現(xiàn)了常數(shù)級(jí)別的空間復(fù)雜度,適用于對(duì)空間要求較高的場(chǎng)景2023-04-04