原文地址http://hi.baidu.com/j_changhong/item/981fa58d05fa755926ebd96b注原文是3.6 此文是3.9 java
java讀取excel文件的順序是:
Excel文件->工做表->行->單元格 對應到POI中,爲:workbook->sheet->row->cell
注意:
注意:
1.sheet, 以0開始,以workbook.getNumberOfSheets()-1結束
2.row, 以0開始(getFirstRowNum),以getLastRowNum結束
3.cell, 以0開始(getFirstCellNum),以getLastCellNum結束,
結束的數目不知什麼緣由與顯示的長度不一樣,可能會偏長 apache
//import org.apache.poi.ss.usermodel.contrib.CellUtil; //import org.apache.poi.ss.usermodel.contrib.RegionUtil; 這兩個類已更換到 這兩個類移動是3.7開始變的 //import org.apache.poi.ss.util.CellUtil; //import org.apache.poi.ss.util.RegionUtil;
package com.svse.test; import java.awt.Color; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Calendar; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFFooter; import org.apache.poi.hssf.usermodel.HSSFPatriarch; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFShape; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFSimpleShape; import org.apache.poi.hssf.usermodel.HSSFTextbox; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Picture; import org.apache.poi.ss.usermodel.PrintSetup; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; //import org.apache.poi.ss.usermodel.contrib.CellUtil; //import org.apache.poi.ss.usermodel.contrib.RegionUtil; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.CellUtil; import org.apache.poi.ss.util.RegionUtil; import org.apache.poi.util.IOUtils; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.BeforeClass; import org.junit.Test; /** * @author WESTDREAM * @since 2010-8-7 下午10:34:03 */ public class POIExcelTest { /** * @throws java.lang.Exception */ public static final String XLS_WORKBOOK_LOCATION = "D:/workbook.xls"; public static final String XLS_OR_XLSX_DIR = "D:/"; public static final String XLSX_WORKBOOK_LOCATION = "D:/workbook.xlsx"; public static final String IMAGE_LOCATION = "book.jpg"; @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void testWriteExcel() { // ## 重複利用 的對象 ##// Workbook wb = null; FileOutputStream fileOut = null; CellStyle cellStyle = null; Cell cell = null; Font font = null; /** * EXCEL早期版本 */ try { // ## 建立早期EXCEL的Workbook ##// wb = new HSSFWorkbook(); // ## 獲取HSSF和XSSF的輔助類 ##// CreationHelper createHelper = wb.getCreationHelper(); // ## 建立一個名爲「New Sheet」的Sheet ##// Sheet sheet = wb.createSheet("New Sheet"); /** 第一行 --- CELL建立,數據填充及日期格式 **/ Row row1 = sheet.createRow(0); // Cell cell = row.createCell(0); // cell.setCellValue(1); // ## 在相應的位置填充數據 ##// row1.createCell(0).setCellValue(1); row1.createCell(1).setCellValue(1.2); row1.createCell(2).setCellValue( createHelper.createRichTextString("CreationHelper---字符串")); row1.createCell(3).setCellValue(true); // ## 填充日期類型的數據---未設置Cell Style ##// row1.createCell(4).setCellValue(new Date()); // ## 填充日期類型的數據---已設置Cell Style ##// cellStyle = wb.createCellStyle(); cellStyle.setDataFormat(createHelper.createDataFormat().getFormat( "yyyy年MM月dd日 hh:mm:ss")); // cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("mm/dd/yyyy h:mm")); cellStyle.setDataFormat(createHelper.createDataFormat().getFormat( "yyyy-MM-dd hh:mm:ss")); cell = row1.createCell(5); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); // ## 另外一種建立日期的方法 ##// /* * cell = row1.createCell(6); * cell.setCellValue(Calendar.getInstance()); * cell.setCellStyle(cellStyle); */ /** 第二行 --- 數據類型 **/ Row row2 = sheet.createRow(1); row2.createCell(0).setCellValue(1.1); row2.createCell(1).setCellValue(new Date()); row2.createCell(2).setCellValue(Calendar.getInstance()); row2.createCell(3).setCellValue("字符串"); row2.createCell(4).setCellValue(true); // ## 錯誤的CELL數據格式 ##// row2.createCell(5).setCellType(HSSFCell.CELL_TYPE_ERROR); /** 第三行 --- CELL的各類對齊方式 **/ Row row3 = sheet.createRow(2); row3.setHeightInPoints(30); // ## 水平居中,底端對齊 ##// createCell(wb, row3, (short) 0, XSSFCellStyle.ALIGN_CENTER, XSSFCellStyle.VERTICAL_BOTTOM); // ## 水平居中,垂直居中 ##// createCell(wb, row3, (short) 1, XSSFCellStyle.ALIGN_CENTER_SELECTION, XSSFCellStyle.VERTICAL_BOTTOM); // ## 填充 ,垂直居中 ##// createCell(wb, row3, (short) 2, XSSFCellStyle.ALIGN_FILL, XSSFCellStyle.VERTICAL_CENTER); // ## 左對齊,垂直居中 ##// createCell(wb, row3, (short) 3, XSSFCellStyle.ALIGN_GENERAL, XSSFCellStyle.VERTICAL_CENTER); // ## 左對齊,頂端對齊 ##// createCell(wb, row3, (short) 4, XSSFCellStyle.ALIGN_JUSTIFY, XSSFCellStyle.VERTICAL_JUSTIFY); // ## 左對齊,頂端對齊 ##// createCell(wb, row3, (short) 5, XSSFCellStyle.ALIGN_LEFT, XSSFCellStyle.VERTICAL_TOP); // ## 右對齊,頂端對齊 ##// createCell(wb, row3, (short) 6, XSSFCellStyle.ALIGN_RIGHT, XSSFCellStyle.VERTICAL_TOP); /** 第四行 --- CELL邊框 **/ Row row4 = sheet.createRow(3); cell = row4.createCell(1); cell.setCellValue(4); cellStyle = wb.createCellStyle(); // ## 設置底部邊框爲THIN ##// cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // ## 設置底部邊框顏色爲黑色 ##// cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // ## 設置左邊邊框爲THIN ##// cellStyle.setBorderLeft(CellStyle.BORDER_THIN); // ## 設置左邊邊框顏色爲紅色 ##// cellStyle.setLeftBorderColor(IndexedColors.RED.getIndex()); // ## 設置右邊邊框爲THIN ##// cellStyle.setBorderRight(CellStyle.BORDER_THIN); // ## 設置右邊邊框顏色爲藍色 ##// cellStyle.setRightBorderColor(IndexedColors.BLUE.getIndex()); // ## 設置頂部邊框爲MEDIUM DASHED ##// cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED); // ## 設置頂部邊框顏色爲黑色 ##// cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); cell.setCellStyle(cellStyle); /** 第五行 --- 填充與顏色 **/ Row row5 = sheet.createRow((short) 4); // ## Aqua背景 ##// cellStyle = wb.createCellStyle(); cellStyle.setFillBackgroundColor(IndexedColors.AQUA.getIndex()); // ## 設置填充模式爲BIG SPOTS ##// cellStyle.setFillPattern(CellStyle.BIG_SPOTS); cell = row5.createCell((short) 1); cell.setCellValue("Aqua背景"); cell.setCellStyle(cellStyle); // ## 橙色前景色(相對 於CELL背景) ##// cellStyle = wb.createCellStyle(); cellStyle.setFillForegroundColor(IndexedColors.ORANGE.getIndex()); // ## 設置填充模式爲SOLID FOREGROUND ##// cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); cell = row5.createCell((short) 2); cell.setCellValue("橙色前景色"); cell.setCellStyle(cellStyle); /** 第六行 --- 合併單元格 **/ Row row6 = sheet.createRow((short) 5); cell = row6.createCell((short) 4); cell.setCellValue("合併單元格測試"); // ## Wrong:EXCEL 2007中打開workbook.xls文件看不到"合併單元格測試",但單元格已經合併了 ##// /* * sheet.addMergedRegion(new CellRangeAddress( 3, //first row * (0-based) 5, //last row (0-based) 4, //first column (0-based) 6 * //last column (0-based) )); */ // ## 正確合併單元格 注意:與上不一樣的是first row=last row ##// sheet.addMergedRegion(new CellRangeAddress(5, // first row (0-based) 5, // last row (0-based) 4, // first column (0-based) 6// last column (0-based) )); /** 第七行 --- 字體 **/ Row row7 = sheet.createRow(6); // ## 建立字體 ##// // 注意:POI限制一個Workbook建立的Font對象最多爲32767,因此不要爲每一個CELL建立一個字體,建議重用字體 font = wb.createFont(); // ## 設置字體大小爲24 ##// font.setFontHeightInPoints((short) 24); // ## 設置字體樣式爲華文隸書 ##// font.setFontName("華文隸書"); // ## 斜體 ##// font.setItalic(true); // ## 添加刪除線 ##// font.setStrikeout(true); // ## 將字體添加到樣式中 ##// cellStyle = wb.createCellStyle(); cellStyle.setFont(font); cell = row7.createCell(1); cell.setCellValue("字體測試"); cell.setCellStyle(cellStyle); /** 第八行 --- 自定義顏色 **/ Row row8 = sheet.createRow(7); cell = row8.createCell(0); cell.setCellValue("自定義顏色測試"); cellStyle = wb.createCellStyle(); // ## 設置填充前景色爲LIME ##// cellStyle.setFillForegroundColor(HSSFColor.LIME.index); // ## 設置填充模式爲SOLID FOREGROUND ##// cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); font = wb.createFont(); // ## 設置字體顏色爲紅色 ##// font.setColor(HSSFColor.RED.index); cellStyle.setFont(font); cell.setCellStyle(cellStyle); /* * cell.setCellValue("自定義顏色測試Palette"); //creating a custom palette * for the workbook HSSFPalette palette = * ((HSSFWorkbook)wb).getCustomPalette(); //replacing the standard * red with freebsd.org red * palette.setColorAtIndex(HSSFColor.RED.index, (byte) 153, //RGB * red (0-255) (byte) 0, //RGB green (byte) 0 //RGB blue ); * //replacing lime with freebsd.org gold * palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) * 204, (byte) 102); */ /** 第九行 --- 換行 **/ Row row9 = sheet.createRow(8); cell = row9.createCell(2); cell.setCellValue("使用 /n及Word-wrap建立一個新行"); cellStyle = wb.createCellStyle(); // ## 設置WrapText爲true ##// cellStyle.setWrapText(true); cell.setCellStyle(cellStyle); // ## 設置行的高度以適應新行 ---兩行##// row9.setHeightInPoints((2 * sheet.getDefaultRowHeightInPoints())); // ## 調整列寬 ##// sheet.autoSizeColumn(2); /** 第十行 --- 數據格式 **/ DataFormat format = wb.createDataFormat(); Row row10 = sheet.createRow(9); cell = row10.createCell(0); cell.setCellValue(11111.25); cellStyle = wb.createCellStyle(); // ## 一位小數 ##// cellStyle.setDataFormat(format.getFormat("0.0")); cell.setCellStyle(cellStyle); cell = row10.createCell(1); cell.setCellValue(11111.25); cellStyle = wb.createCellStyle(); // ## 四位小數,千位逗號隔開 ##// // #,###.0000效果同樣 cellStyle.setDataFormat(format.getFormat("#,##0.0000")); cell.setCellStyle(cellStyle); // ## 將文件寫到硬盤上 ##// fileOut = new FileOutputStream(XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } /** * EXCEL 2007及之後 */ /* * try { wb = new XSSFWorkbook(); wb.createSheet("sheet1"); Cell cell = * row.createCell( 0); cell.setCellValue("custom XSSF colors"); * CellStyle style1 = wb.createCellStyle(); * style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, * 0, 128))); style1.setFillPattern(CellStyle.SOLID_FOREGROUND); fileOut * = new FileOutputStream("d:/workbook.xlsx"); wb.write(fileOut); * fileOut.close(); } catch (FileNotFoundException e) { * e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } */ } /** * 建立相應格式的CELL */ public void createCell(Workbook wb, Row row, short column, short halign, short valign) { Cell cell = row.createCell(column); // ## 給CELL賦值 ##// cell.setCellValue("對齊排列"); CellStyle cellStyle = wb.createCellStyle(); // ## 設置水平對齊方式 ##// cellStyle.setAlignment(halign); // ## 設置垂直對齊方式 ##// cellStyle.setVerticalAlignment(valign); // ## 添加CELL樣式 ##// cell.setCellStyle(cellStyle); } /** * 測試POI EXCEL迭代和或CELL中的值 */ @Test public void testExcelIteratorAndCellContents() { try { // ## 建立HSSFWorkbook實例 ##// Workbook wb = new HSSFWorkbook(new FileInputStream( XLS_WORKBOOK_LOCATION)); // ## 得到第一個SHEET ##// Sheet sheet = wb.getSheetAt(0); // or we could cast into // HSSFSheet,that doesn't matter /** 第一種迭代方法 **/ /* * //## 迭代ROW ##// for (Iterator<Row> rit = sheet.rowIterator(); * rit.hasNext(); ) { Row row = rit.next(); //## 迭代CELL ##// for * (Iterator<Cell> cit = row.cellIterator(); cit.hasNext(); ) { Cell * cell = cit.next(); System.out.println(cell); } } */ /** 第二種迭代方法 **/ for (Row row : sheet) { for (Cell cell : row) { // ## 獲取CellReference對象 ##/ CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex()); System.out.print(cellRef.formatAsString()); System.out.print(" - "); // ## 根據CELL值類型進行相應處理 ##/ switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: System.out.println(cell.getRichStringCellValue() .getString()); break; case Cell.CELL_TYPE_NUMERIC: // ## yyyy年mm月dd日 hh:mm:ss此種格式日期不能識別 ##// // ## mm/dd/yyyy h:mm,yyyy-MM-dd // hh:mm:ss能夠識別,估計是POI對中文日期支持不怎麼好的問題 ##// if (DateUtil.isCellDateFormatted(cell)) { System.out.println(cell.getDateCellValue()); } else { System.out.println(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: System.out.println(cell.getCellFormula()); break; case Cell.CELL_TYPE_ERROR: System.out.println(cell.getErrorCellValue()); break; default: System.out.println(); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 修改文件測試 */ @Test public void testReadingAndRewritingWorkbooks() { InputStream inp = null; try { inp = new FileInputStream(XLS_WORKBOOK_LOCATION); // inp = new FileInputStream("workbook.xlsx"); // ## 得到要修改的Workbook ##/ Workbook wb = WorkbookFactory.create(inp); // ## 獲取要修改的Sheet ##// Sheet sheet = wb.getSheetAt(0); // ## 獲取要修改的Row ##// Row row = sheet.getRow(1); // ## 獲取要修改的Cell,若是沒有相應位置的Cell那麼就建立一個 ##// Cell cell = row.getCell(2); if (cell == null) cell = row.createCell(2); // ## 寫入修改數據 ##// cell.setCellType(Cell.CELL_TYPE_STRING); cell.setCellValue("修改文件測試"); // ## 將文件寫到硬盤上 ##// FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (InvalidFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 暫時沒看到有什麼區別 */ @Test public void testFitSheetToOnePage() { try { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("format sheet"); PrintSetup ps = sheet.getPrintSetup(); sheet.setAutobreaks(true); ps.setFitHeight((short) 1); ps.setFitWidth((short) 1); // Create various cells and rows for spreadsheet. FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 設置打印區域測試 */ @Test public void testSetPrintArea() { /** * 注意:我測試的時候用的是EXCEL 2007打開的,效果不明顯,只能控制列且列好像也是不正確的。 可是我用EXCEL * 2007轉換了一下,xls,xlsx的都正確了,目前還不知道是什麼問題。 */ try { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("Print Area Sheet"); Row row = sheet.createRow(0); row.createCell(0).setCellValue("第一個單元格"); row.createCell(1).setCellValue("第二個單元格"); row.createCell(2).setCellValue("第三個單元格"); row = sheet.createRow(1); row.createCell(0).setCellValue("第四個單元格"); row.createCell(1).setCellValue("第五個單元格"); row = sheet.createRow(2); row.createCell(0).setCellValue("第六個單元格"); row.createCell(1).setCellValue("第七個單元格"); // ## 設置打印區域 A1--C2 ##// // wb.setPrintArea(0, "$A$1:$C$2"); // ## 或者使用如下方法設置 ##// wb.setPrintArea(0, // Sheet頁 0, // 開始列 2, // 結束列 0, // 開始行 1// 結束行 ); FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 設置頁腳測試 用「頁面佈局」能夠看到效果 下列代碼只適用xls */ @Test public void testSetPageNumbersOnFooter() { try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("Footer Test"); // ## 得到頁腳 ##/ HSSFFooter footer = sheet.getFooter(); Row row; // ## 將 當前頁/總頁數 寫在右邊 ##/ footer.setRight(HSSFFooter.page() + "/" + HSSFFooter.numPages()); for (int i = 0; i < 100; i++) { row = sheet.createRow(i); for (int j = 0; j < 20; j++) { row.createCell(j).setCellValue("A" + i + j); } } FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 測試一些POI提供的比較方便的函數 文檔中有些以HSSF爲前綴的類的方法以過期(e.g: HSSFSheet, HSSFCell etc.), * 測試的時候我去掉了HSSF前綴,固然也就是如今POI推薦的接口(Sheet,Row,Cell etc.) */ @Test public void testConvenienceFunctions() { try { Workbook wb = new HSSFWorkbook(); Sheet sheet1 = wb.createSheet("Convenience Functions"); // ## 設置Sheet的顯示比例 這裏是3/4,也就是 75% ##// sheet1.setZoom(3, 4); // ## 合併單元格 ##// Row row = sheet1.createRow((short) 1); Row row2 = sheet1.createRow((short) 2); Cell cell = row.createCell((short) 1); cell.setCellValue("合併單元格測試"); // ## 建立合併區域 ##// CellRangeAddress region = new CellRangeAddress(1, (short) 1, 4, (short) 4); sheet1.addMergedRegion(region); // ## 設置邊框及邊框顏色 ##// final short borderMediumDashed = CellStyle.BORDER_MEDIUM_DASHED; RegionUtil.setBorderBottom(borderMediumDashed, region, sheet1, wb); RegionUtil.setBorderTop(borderMediumDashed, region, sheet1, wb); RegionUtil.setBorderLeft(borderMediumDashed, region, sheet1, wb); RegionUtil.setBorderRight(borderMediumDashed, region, sheet1, wb); // ## 設置底部邊框的顏色 ##// RegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); // ## 設置頂部邊框的顏色 ##// RegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); // ## 設置左邊邊框的顏色 ##// RegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); // ## 設置右邊邊框的顏色 ##// RegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb); // ## CellUtil的一些用法 ##/ CellStyle style = wb.createCellStyle(); style.setIndention((short) 10); CellUtil.createCell(row, 8, "CellUtil測試", style); Cell cell2 = CellUtil.createCell(row2, 8, "CellUtil測試"); // ## 設置對齊方式爲居中對齊 ##// CellUtil.setAlignment(cell2, wb, CellStyle.ALIGN_CENTER); // ## 將Workbook寫到硬盤上 ##// FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 測試凍結窗格和拆分 */ @Test public void testSplitAndFreezePanes() { try { Workbook wb = new HSSFWorkbook(); Sheet sheet1 = wb.createSheet("凍結首行Sheet"); Sheet sheet2 = wb.createSheet("凍結首列Sheet"); Sheet sheet3 = wb.createSheet("凍結兩行兩列 Sheet"); Sheet sheet4 = wb.createSheet("拆分Sheet"); /** 凍結窗格 **/ /* * createFreezePane( colSplit, rowSplit, topRow, leftmostColumn ) * colSplit 凍結線水平位置 rowSplit 凍結線垂直位置 topRow Top row visible in * bottom pane leftmostColumn Left column visible in right pane. */ // ## 凍結首行 ##// sheet1.createFreezePane(0, 1, 0, 1); // ## 凍結首列 ##// sheet2.createFreezePane(1, 0, 1, 0); // ## 凍結兩行兩列 ##// sheet3.createFreezePane(2, 2); // ## 拆分,左下的爲面板爲激活狀態 ##// sheet4.createSplitPane(2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT); FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 測試簡單圖形 */ @Test public void testDrawingShapes() { try { Workbook wb = new HSSFWorkbook(); Sheet sheet = wb.createSheet("Drawing Shapes"); // ## 獲得一個HSSFPatriarch對象,有點像畫筆可是注意區別 ##// HSSFPatriarch patriarch = (HSSFPatriarch) sheet .createDrawingPatriarch(); /* * 構造器: HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short * col1, int row1, short col2, int row2) 描述: * 建立HSSFClientAnchor類的實例,設置該anchor的頂-左和底-右座標(至關於錨點,也就是圖像出現的位置,大小等). * Creates a new client anchor and sets the top-left and * bottom-right coordinates of the anchor. 參數: dx1 第一個單元格的x座標 dy1 * 第一個單元格的y座標 dx2 第二個單元格的x座標 dy2 第二個單元格的y座標 col1 第一個單元格所在列 row1 * 第一個單元格所在行 col2 第二個單元格所在列 row2 第二個單元格所在行 */ HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 512, 255, (short) 1, 0, (short) 1, 0); // ## 經過HSSFClientAnchor類的對象建立HSSFSimpleShape的實例 ##// HSSFSimpleShape shape = patriarch.createSimpleShape(anchor); // ## 畫個橢圓 ##// shape.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL); // ## 這幾個是沒問題的 ##// // shape.setLineStyleColor(10,10,10); // shape.setFillColor(90,10,200); // shape.setLineStyleColor(HSSFColor.BLUE.index); //設置不了,尚不知緣由 // ## 設置線條顏色爲紅色 ##// // shape.setLineStyleColor(Color.BLUE.getRGB()); //搞不清楚爲什是反的BLUE:紅色 // RED:藍色,是否是開發POI的有點色盲,JUST KIDDING! // ## 設置填充顏色爲灰色 ##// shape.setFillColor(Color.GRAY.getRGB()); // 這個又能夠 // ## 設置線條寬度爲3pt ##// shape.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3); // ## 設置線條的樣式爲點式 ##// shape.setLineStyle(HSSFShape.LINESTYLE_DOTSYS); // ## 建立文本框並填充文字 「建立文本框」 ##// HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor( 0, 0, 0, 0, (short) 1, 1, (short) 2, 2)); RichTextString text = new HSSFRichTextString("建立文本框"); // ## 建立字體 ##// Font font = wb.createFont(); // ## 斜體 ##// font.setItalic(true); // ## 設置字體顏色爲藍色 ##// // font.setColor((short)Color.BLUE.getBlue()); not work font.setColor(HSSFColor.BLUE.index); // ## 添加字體 ##// text.applyFont(font); textbox.setString(text); // ## 將文件寫到硬盤上 ##// FileOutputStream fileOut = new FileOutputStream( XLS_WORKBOOK_LOCATION); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 添加圖片到工做薄測試 已測試PNG,JPG,GIF */ @Test public void testImages() { try { // ## 建立一個新的工做薄 ##// Workbook wb = new XSSFWorkbook(); // or new HSSFWorkbook(); // ## 添加圖片到該工做薄 ##// InputStream is = new FileInputStream(IMAGE_LOCATION); byte[] bytes = IOUtils.toByteArray(is); int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); is.close(); CreationHelper helper = wb.getCreationHelper(); // ## 建立一個名爲「添加圖片」的Sheet ##// Sheet sheet = wb.createSheet("添加圖片"); // ## 建立一個DrawingPatriarch實例 ##// Drawing drawing = sheet.createDrawingPatriarch(); // ## 設置圖片的形狀,位置等 ##// ClientAnchor anchor = helper.createClientAnchor(); // set top-left corner of the picture, // subsequent call of Picture#resize() will operate relative to it anchor.setCol1(3); anchor.setRow1(2); Picture pict = drawing.createPicture(anchor, pictureIdx); // ## 自動設置圖片的大小 注意:只支持PNG,JPG,GIF(BMP未測試)##// pict.resize(); // ## 保存Workbook ##// String file = "picture.xls"; if (wb instanceof XSSFWorkbook) file += "x"; FileOutputStream fileOut = new FileOutputStream(XLS_OR_XLSX_DIR + file); wb.write(fileOut); fileOut.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }