今天使用SXSSFWorkbook導出了一份比較復雜的Excel文件,總結如下
豎向文字
CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); cellStyle.setRotation((short)255);//將文本改為豎向 cellStyle.setVerticalAlignment(VerticalAlignment.TOP);//設置單元格頂端對其
合並單元格
//第一個參數startRow,開始行 //第二個參數endRow,結束行 //第三個參數startCol,開始列 //第四個參數endCol,結束列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));//合並第一行0、1、2單元格
CellStyle克隆合並
有些情況下一個單元格需要兩個CellStyle,但是設置第二個CellStyle時第一個CellStyle會被覆蓋,官網提供了一個方法用來合並CellStyle
//第一個CellStyle,僅設置豎向顯示文字 CellStyle cellStyle1 = sheet.getWorkbook().createCellStyle(); cellStyle1.setRotation((short) 255); //第二個CellStyle,僅設置單元格背景顏色 CellStyle cellStyle2 = sheet.getWorkbook().createCellStyle(); cellStyle2.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //合並cellStyle1和cellStyle2,cellStyle1既可以豎向顯示文字又可以設置單元格背景顏色 cellStyle1.cloneStyleFrom(cellStyle2);
改變文本顏色
CellStyle cellStyle = sheet.getWorkbook().createCellStyle(); Font font = sheet.getWorkbook().createFont(); font.setColor(IndexedColors.RED.getIndex()); cellStyle.setFont(font);
分塊制表
按照通常的邏輯,制表的順序應該是先從第一行開始,第一行完成后,開始處理第二行,以此類推。
但是有時會遇到一種情況,分塊制表比較方便,即處理完(A1,D4)
后再處理(E1,H4)
,但是這樣就會有一個問題,我在處理(A1,D4)
時使用sheet.createRow()
創建了四個Row
對象,(A1,D4)
處理完成后再處理(E1,H4)
時,我又使用sheet.createRow()
創建了四個Row
對象,這時我發現,(A1,D4)
中的數據被清空了,於是我想,會不會是(A1,D4)
中的行對象被覆蓋了,看了源碼后發現確實是這樣
private final TreeMap<Integer, SXSSFRow> _rows = new TreeMap(); public SXSSFRow createRow(int rownum) { /*此處省略部分代碼*/ SXSSFRow newRow = new SXSSFRow(this); this._rows.put(rownum, newRow); /*此處省略部分代碼*/ }
這樣的話我們只能在處理表格之前先使用sheet.createRow(index)
把Row
對象一次性創建出來,只后需要用到Row
對象時,直接使用sheet.getRow(index)
即可,我自己寫了一個方法,可以參考一下。
/** * 在sheet頁中創建行與單元格 * @param sheet * @param startRow 開始行 * @param endRow 結束行 */ private void createRow(Sheet sheet, int startRow, int endRow) { for (int i = startRow; i < endRow; i++) { Row row = sheet.createRow(i); } }
參考網站:http://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/XSSFWorkbook.html