Java使用Apache POI操作Excel詳解
在Java中操作Excel是日常工作中經(jīng)常遇到的問(wèn)題。使用Apache Poi是一種流行且廣泛使用的方式,它提供了各種庫(kù)和工具,可以幫助開(kāi)發(fā)人員直接從Java代碼中讀取、寫(xiě)入和處理Excel文件。本篇文章將詳細(xì)介紹如何使用Apache Poi來(lái)進(jìn)行Excel文件操作,在這里,我們著重講解Apache Poi的基礎(chǔ)知識(shí)、如何讀取Excel文件以及如何編寫(xiě)數(shù)據(jù)到Excel文件。
1.導(dǎo)入依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency>
2.Excel表單元格控制
2.1 最基礎(chǔ)的行列控制
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); //創(chuàng)建工作表(Sheet) HSSFSheet sheet = workbook.createSheet("Test"); // 創(chuàng)建行,從0開(kāi)始 HSSFRow row = sheet.createRow(0); // 創(chuàng)建行的單元格,也是從0開(kāi)始 HSSFCell cell = row.createCell(0); // 設(shè)置單元格內(nèi)容 cell.setCellValue("CsdnerM"); // 設(shè)置單元格內(nèi)容,重載 row.createCell(1).setCellValue(false); // 設(shè)置單元格內(nèi)容,重載 row.createCell(2).setCellValue(new Date()); // 設(shè)置單元格內(nèi)容,重載 row.createCell(3).setCellValue(12.345); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段 Java 代碼演示了如何創(chuàng)建和操作一個(gè)Excel文件。代碼使用Apache POI庫(kù),它提供了創(chuàng)建和修改Excel文件的功能。在此代碼中,先創(chuàng)建Workbook對(duì)象,然后在其上創(chuàng)建一個(gè)名為“Test”的工作表Sheet,并在該表中插入一行。接著,通過(guò)創(chuàng)建Row對(duì)象和隨后的Cell對(duì)象,并使用setCellValue()方法來(lái)設(shè)置單元格中的數(shù)據(jù)。最后將生成的XLS文件保存到本地磁盤(pán)中
需要注意的是,該代碼中提供的文件路徑僅適用于特定電腦上的特定位置,而實(shí)際應(yīng)用程序需要使用相應(yīng)的路徑。
2.2 設(shè)置格式
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(0); //設(shè)置日期格式--使用Excel內(nèi)嵌的格式 HSSFCell cell = row.createCell(0); cell.setCellValue(new Date()); HSSFCellStyle style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); cell.setCellStyle(style); //設(shè)置保留2位小數(shù)--使用Excel內(nèi)嵌的格式 cell = row.createCell(1); cell.setCellValue(12.3456789); style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00")); cell.setCellStyle(style); //設(shè)置貨幣格式--使用自定義的格式 cell = row.createCell(2); cell.setCellValue(12345.6789); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0")); cell.setCellStyle(style); //設(shè)置百分比格式--使用自定義的格式 cell = row.createCell(3); cell.setCellValue(0.123456789); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("0.00%")); cell.setCellStyle(style); //設(shè)置中文大寫(xiě)格式--使用自定義的格式 cell = row.createCell(4); cell.setCellValue(12345); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0")); cell.setCellStyle(style); //設(shè)置科學(xué)計(jì)數(shù)法格式--使用自定義的格式 cell = row.createCell(5); cell.setCellValue(12345); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00")); cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
2.3 合并單元格
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row=sheet.createRow(0); //合并列 HSSFCell cell=row.createCell(0); cell.setCellValue("合并列"); CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5); sheet.addMergedRegion(region); //合并行 cell=row.createCell(6); cell.setCellValue("合并行"); region=new CellRangeAddress(0, 5, 7, 7); sheet.addMergedRegion(region); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何使用Apache POI庫(kù)在Excel文件中合并單元格。在此代碼中,首先創(chuàng)建Workbook對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test”的工作表Sheet,并在該表中插入一行。接著,在該行的第0個(gè)單元格上調(diào)用createCell()方法以創(chuàng)建單元格對(duì)象,并將其內(nèi)容設(shè)置為“合并列”。然后定義需要合并的單元格區(qū)域,使用CellRangeAddress類(lèi)來(lái)指定行號(hào)和列號(hào)以及最后單元格的行號(hào)和列號(hào)。最后使用addMergedRegion方法來(lái)指定要合并的單元格范圍。另外,在該行的第6個(gè)單元格上繼續(xù)重復(fù)相同的過(guò)程,但應(yīng)用于列而不是行。最后將生成的XLS文件保存到本地磁盤(pán)中
需要注意的是,單元格合并可能導(dǎo)致數(shù)據(jù)丟失或者格式上的不準(zhǔn)確性。特別是當(dāng)您試圖合并帶有邊框、樣式或注釋等屬性的單元格時(shí)請(qǐng)小心,這些屬性可能會(huì)丟失。
2.4 單元格對(duì)齊
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell=row.createCell(0); cell.setCellValue("單元格對(duì)齊"); HSSFCellStyle style=workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style.setWrapText(true);//自動(dòng)換行 style.setIndention((short)5);//縮進(jìn) style.setRotation((short)0);//文本旋轉(zhuǎn),這里的取值是從-90到90,而不是0-180度。 cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
2.5 設(shè)置邊框
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell=row.createCell(1); cell.setCellValue("設(shè)置邊框"); HSSFCellStyle style=workbook.createCellStyle(); style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上邊框 style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下邊框 style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左邊框 style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右邊框 style.setTopBorderColor(HSSFColor.RED.index);//上邊框顏色 style.setBottomBorderColor(HSSFColor.BLUE.index);//下邊框顏色 style.setLeftBorderColor(HSSFColor.GREEN.index);//左邊框顏色 style.setRightBorderColor(HSSFColor.PINK.index);//右邊框顏色 cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何使用Apache POI庫(kù)在Excel中設(shè)置單元格邊框及邊框顏色。在此代碼中,首先創(chuàng)建Workbook對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test”的工作表Sheet。接著,在該工作表的第一行創(chuàng)建一個(gè)單元格,并設(shè)置該單元格的值為“設(shè)置邊框”。
然后,通過(guò)createCellStyle()方法創(chuàng)建一個(gè)HSSFCellStyle對(duì)象并將其賦值給style變量。接著調(diào)用setBorderXXX()方法來(lái)設(shè)置不同邊框的樣式,包括上、下、左和右邊框的線條類(lèi)型和寬度以及沿邊框的顏色。最后,將創(chuàng)建的樣式應(yīng)用于單元格上,并將生成的XLS文件保存到本地磁盤(pán)中。
需要注意的是,上述代碼中指定的顏色索引可能與實(shí)際顯示的顏色略有不同。建議使用實(shí)際顏色名稱或RGB值來(lái)避免出現(xiàn)問(wèn)題。另外,在設(shè)置邊框時(shí),請(qǐng)確保單元格中的文本或數(shù)據(jù)不會(huì)被覆蓋或隱藏。
2.6 設(shè)置字體
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell = row.createCell(1); cell.setCellValue("設(shè)置字體"); HSSFCellStyle style = workbook.createCellStyle(); HSSFFont font = workbook.createFont(); font.setFontName("華文行楷");//設(shè)置字體名稱 font.setFontHeightInPoints((short)28);//設(shè)置字號(hào) font.setColor(HSSFColor.RED.index);//設(shè)置字體顏色 font.setUnderline(FontFormatting.U_SINGLE);//設(shè)置下劃線 font.setTypeOffset(FontFormatting.SS_SUPER);//設(shè)置上標(biāo)下標(biāo) font.setStrikeout(true);//設(shè)置刪除線 style.setFont(font); cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
2.7 設(shè)置圖案樣式
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell = row.createCell(1); HSSFCellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(HSSFColor.GREEN.index);//設(shè)置圖案顏色 style.setFillBackgroundColor(HSSFColor.RED.index);//設(shè)置圖案背景色 style.setFillPattern(HSSFCellStyle.SQUARES);//設(shè)置圖案樣式 cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
2.8 設(shè)置寬度和高度
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(1); HSSFCell cell = row.createCell(1); cell.setCellValue("123456789012345678901234567890"); sheet.setColumnWidth(1, 31 * 256);//設(shè)置第一列的寬度是31個(gè)字符寬度 row.setHeightInPoints(50);//設(shè)置行的高度是50個(gè)點(diǎn) FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
3.使用Excel公式
3.1 基本計(jì)算
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellFormula("2+3*4");//設(shè)置公式 cell = row.createCell(1); cell.setCellValue(10); cell = row.createCell(2); cell.setCellFormula("A1*B1");//設(shè)置公式 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何在使用Apache POI庫(kù)創(chuàng)建的Excel工作簿中設(shè)置單元格公式。在此代碼中,首先創(chuàng)建Workbook對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test”的工作表Sheet。接著,在該工作表的第一行創(chuàng)建三個(gè)單元格。
第一個(gè)單元格(A1)設(shè)置了公式“2+34”,用于計(jì)算結(jié)果。第二個(gè)單元格(B1)設(shè)置了值為10,作為第三個(gè)單元格(C1)使用公式“A1B1”進(jìn)行乘法運(yùn)算的一個(gè)操作數(shù)。需要注意的是,在設(shè)置公式時(shí),需要按照Microsoft Excel的語(yǔ)法規(guī)則來(lái)編寫(xiě)公式,且單元格引用需要按照[A,B]的格式表示。
最后,將生成的XLS文件保存到本地磁盤(pán)中,并關(guān)閉輸出流。
需要注意的是,單元格的公式計(jì)算依賴于單元格的數(shù)據(jù)類(lèi)型和格式,確保公式正確計(jì)算之前需要設(shè)定好相應(yīng)的數(shù)據(jù)類(lèi)型;同時(shí),也需小心處理不同單元格之間的對(duì)齊及其他隱藏相關(guān)問(wèn)題。
3.2 sum行數(shù)
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(1); row.createCell(1).setCellValue(2); row.createCell(2).setCellValue(3); row.createCell(3).setCellValue(4); row.createCell(4).setCellValue(5); row = sheet.createRow(1); row.createCell(0).setCellFormula("sum(A1,C1)");//等價(jià)于"A1+C1" row.createCell(1).setCellFormula("sum(B1:D1)");//等價(jià)于"B1+C1+D1" FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
3.3 日期函數(shù)
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFCellStyle style=workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd")); HSSFRow row = sheet.createRow(0); Calendar date=Calendar.getInstance();//日歷對(duì)象 HSSFCell cell=row.createCell(0); date.set(2011,2, 7); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個(gè)單元格開(kāi)始時(shí)間設(shè)置完成 cell=row.createCell(1); date.set(2014,4, 25); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個(gè)單元格結(jié)束時(shí)間設(shè)置完成 cell=row.createCell(3); cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"y\"),\"年\")"); cell=row.createCell(4); cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"m\"),\"月\")"); cell=row.createCell(5); cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"d\"),\"日\(chéng)")"); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
3.4 字符串函數(shù)
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue("abcdefg"); row.createCell(1).setCellValue("aa bb cc dd ee fF GG"); row.createCell(3).setCellFormula("UPPER(A1)"); row.createCell(4).setCellFormula("PROPER(B1)"); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何使用Apache POI庫(kù)在Excel工作簿中設(shè)置單元格函數(shù)。在此代碼中,首先創(chuàng)建Workbook對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test”的工作表Sheet。接著,在該工作表的第一行中創(chuàng)建四個(gè)單元格。
第一個(gè)單元格(A1)設(shè)置了文本值"abcdefg",用于進(jìn)行字母大小寫(xiě)轉(zhuǎn)換;而第二個(gè)單元格(B1)設(shè)置了文本值"aa bb cc dd ee fF GG",也用于類(lèi)似的轉(zhuǎn)換操作。第三個(gè)單元格(D1)設(shè)置了公式 "UPPER(A1)",用于將第一個(gè)單元格的文本轉(zhuǎn)換為大寫(xiě)字母。相應(yīng)地,第四個(gè)單元格(E1)設(shè)置了公式 "PROPER(B1)" ,用于將第二個(gè)單元格的文本轉(zhuǎn)換為每個(gè)單詞首字母大寫(xiě),其余小寫(xiě)的格式。
最后,將生成的XLS文件保存到本地磁盤(pán)中,并關(guān)閉輸出流。
需要注意的是,在設(shè)置函數(shù)時(shí),需要按照Microsoft Excel的語(yǔ)法規(guī)則來(lái)編寫(xiě)公式,且單元格引用需要按照[A,B]的格式表示;同時(shí),請(qǐng)注意命名約定及函數(shù)參數(shù)個(gè)數(shù)、類(lèi)型等相關(guān)要素。
3.5 獲取返回值
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(0); row.createCell(0).setCellValue(7);//A1 row.createCell(1).setCellValue(8);//B1 HSSFCell cell=row.createCell(2); cell.setCellFormula("A1*B1+14"); HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook); cell = e.evaluateInCell(cell);//若Excel文件不是POI創(chuàng)建的,則不必調(diào)用此方法 System.out.println("公式計(jì)算結(jié)果:"+cell.getNumericCellValue()); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
4.使用圖形
4.1 畫(huà)線
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFPatriarch patriarch=sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0,(short)1, 0,(short)4, 4); HSSFSimpleShape line = patriarch.createSimpleShape(anchor); line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//設(shè)置圖形類(lèi)型 line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//設(shè)置圖形樣式 line.setLineWidth(6350);//在POI中線的寬度12700表示1pt,所以這里是0.5pt粗的線條。 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何使用Apache POI庫(kù)在Excel工作簿中插入一條線條。在此代碼中,首先創(chuàng)建Workbook對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test”的工作表Sheet。接著,用 createDrawingPatriarch() 方法獲取用于包含圖形元素的對(duì)象,再使用 createSimpleShape() 創(chuàng)建一個(gè)簡(jiǎn)單形狀,并指定其描點(diǎn)的位置及大小。
在此示例中,HSSFClientAnchor對(duì)象定義要插入線條的起始和結(jié)束坐標(biāo)。然后,通過(guò)設(shè)置HSSFSimpleShape對(duì)象的參數(shù)來(lái)構(gòu)造直線。其中, setShapeType() 方法用于設(shè)置圖形類(lèi)型,這里選擇直線,setLineStyle() 方法用于設(shè)置直線樣式,這里選擇實(shí)線;而 setLineWidth() 方法用于設(shè)置線條寬度,采用POI內(nèi)置的長(zhǎng)度單位,以1/12700英寸為基礎(chǔ)計(jì)算。
最后,將生成的XLS文件保存到本地磁盤(pán)中,并關(guān)閉輸出流。
需要注意的是,在進(jìn)行圖形元素設(shè)置時(shí),請(qǐng)注意對(duì)應(yīng)的坐標(biāo)系,特別是行列數(shù)目等相關(guān)細(xì)節(jié)。
4.2 畫(huà)矩形
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFPatriarch patriarch=sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(255,122,255, 122, (short)1, 0,(short)4, 3); HSSFSimpleShape rec = patriarch.createSimpleShape(anchor); rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE); rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設(shè)置邊框樣式 rec.setFillColor(255, 0, 0);//設(shè)置填充色 rec.setLineWidth(25400);//設(shè)置邊框?qū)挾? rec.setLineStyleColor(0, 0, 255);//設(shè)置邊框顏色 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
4.3 畫(huà)圓形
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFPatriarch patriarch=sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(255,122,255, 122, (short)1, 0,(short)4, 3); HSSFSimpleShape rec = patriarch.createSimpleShape(anchor); rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//設(shè)置圖片類(lèi)型 rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//設(shè)置邊框樣式 rec.setFillColor(255, 0, 0);//設(shè)置填充色 rec.setLineWidth(25400);//設(shè)置邊框?qū)挾? rec.setLineStyleColor(0, 0, 255);//設(shè)置邊框顏色 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
4.4 畫(huà)網(wǎng)格
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) HSSFRow row = sheet.createRow(2); row.createCell(1); row.setHeightInPoints(240); sheet.setColumnWidth(2, 9000); int linesCount = 20; HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //因?yàn)镠SSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式 double xRatio = 1023.0 / (linesCount * 10); double yRatio = 255.0 / (linesCount * 10); // 畫(huà)豎線 int x1 = 0; int y1 = 0; int x2 = 0; int y2 = 200; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); x1 += 10; x2 += 10; } // 畫(huà)橫線 x1 = 0; y1 = 0; x2 = 200; y2 = 0; for (int i = 0; i < linesCount; i++) { HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); y1 += 10; y2 += 10; } FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
4.5 插入圖片
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //創(chuàng)建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 創(chuàng)建工作表(Sheet) FileInputStream stream = new FileInputStream("C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\11.jpg"); byte[] bytes = new byte[(int) stream.getChannel().size()]; stream.read(bytes);//讀取圖片到二進(jìn)制數(shù)組 int pictureIdx = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 0, 0, (short) 5, 5); HSSFPicture pict = patriarch.createPicture(anchor, pictureIdx); pict.resize();//自動(dòng)調(diào)節(jié)圖片大小,圖片位置信息可能丟失 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
5.Excel行列操作
鎖定列
public class Test00 { public static void main(String[] args) throws IOException { //文件路徑 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; HSSFWorkbook workbook = new HSSFWorkbook();// 創(chuàng)建Excel文件(Workbook) HSSFSheet sheet= workbook.createSheet("Test0");// 創(chuàng)建工作表(Sheet) sheet.createFreezePane(2, 3, 15, 25);//凍結(jié)行列 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
這段Java代碼演示了如何使用Apache POI庫(kù)在Excel工作簿中凍結(jié)指定的行和列。在此代碼中,首先創(chuàng)建 Workbook 對(duì)象,然后在該工作簿上創(chuàng)建一個(gè)名為“Test0”的工作表 Sheet。接著,使用 createFreezePane() 方法來(lái)設(shè)置要凍結(jié)的行和列。
在此示例中,使用的 createFreezePane() 方法的參數(shù)分別是:凍結(jié)列數(shù)、凍結(jié)行數(shù)(即滾動(dòng)區(qū)域頂部的可見(jiàn)行數(shù))、右邊區(qū)域的左側(cè)列數(shù)、下方區(qū)域的頂部行數(shù)。這里將從第4行、第3列開(kāi)始凍結(jié),并分別向右15列、向下25行。
最后,將生成的XLS文件保存到本地磁盤(pán)中,并關(guān)閉輸出流。
需要注意的是,在進(jìn)行createFreezePane()方法設(shè)置時(shí),請(qǐng)確??梢?jiàn)區(qū)域以及凍結(jié)列數(shù)、行數(shù)參數(shù)的設(shè)定符合預(yù)期。
Apache Poi是一個(gè)開(kāi)源項(xiàng)目,由Apache軟件基金會(huì)維護(hù),幾乎成為了Java開(kāi)發(fā)人員中操作Excel的事實(shí)標(biāo)準(zhǔn)。通過(guò)掌握本文所提供的基礎(chǔ)知識(shí)、代碼示例和最佳實(shí)踐,讀者們應(yīng)該能夠開(kāi)始使用Apache Poi來(lái)進(jìn)行Excel文件操作,并基于自己的需要?jiǎng)?chuàng)造出更多有效的使用案例。
以上就是Java使用Apache POI操作Excel詳解的詳細(xì)內(nèi)容,更多關(guān)于Java操作Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02學(xué)會(huì)Java字節(jié)碼指令,成為技術(shù)大佬
Java 字節(jié)碼指令是 JVM 體系中非常難啃的一塊硬骨頭,我估計(jì)有些讀者會(huì)有這樣的疑惑,“Java 字節(jié)碼難學(xué)嗎?我能不能學(xué)會(huì)啊?”本文帶領(lǐng)大家一探究竟,幫助大家搞懂java底層代碼如何執(zhí)行2021-08-08使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Mybatis攔截器實(shí)現(xiàn)公共字段填充的示例代碼
本文介紹了使用Spring Boot和MyBatis實(shí)現(xiàn)公共字段的自動(dòng)填充功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12