Java使用Apache POI操作Excel詳解
在Java中操作Excel是日常工作中經(jīng)常遇到的問題。使用Apache Poi是一種流行且廣泛使用的方式,它提供了各種庫和工具,可以幫助開發(fā)人員直接從Java代碼中讀取、寫入和處理Excel文件。本篇文章將詳細(xì)介紹如何使用Apache Poi來進行Excel文件操作,在這里,我們著重講解Apache Poi的基礎(chǔ)知識、如何讀取Excel文件以及如何編寫數(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開始 HSSFRow row = sheet.createRow(0); // 創(chuàng)建行的單元格,也是從0開始 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)建和操作一個Excel文件。代碼使用Apache POI庫,它提供了創(chuàng)建和修改Excel文件的功能。在此代碼中,先創(chuàng)建Workbook對象,然后在其上創(chuàng)建一個名為“Test”的工作表Sheet,并在該表中插入一行。接著,通過創(chuàng)建Row對象和隨后的Cell對象,并使用setCellValue()方法來設(shè)置單元格中的數(shù)據(jù)。最后將生成的XLS文件保存到本地磁盤中
需要注意的是,該代碼中提供的文件路徑僅適用于特定電腦上的特定位置,而實際應(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è)置中文大寫格式--使用自定義的格式 cell = row.createCell(4); cell.setCellValue(12345); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0")); cell.setCellStyle(style); //設(shè)置科學(xué)計數(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庫在Excel文件中合并單元格。在此代碼中,首先創(chuàng)建Workbook對象,然后在該工作簿上創(chuàng)建一個名為“Test”的工作表Sheet,并在該表中插入一行。接著,在該行的第0個單元格上調(diào)用createCell()方法以創(chuàng)建單元格對象,并將其內(nèi)容設(shè)置為“合并列”。然后定義需要合并的單元格區(qū)域,使用CellRangeAddress類來指定行號和列號以及最后單元格的行號和列號。最后使用addMergedRegion方法來指定要合并的單元格范圍。另外,在該行的第6個單元格上繼續(xù)重復(fù)相同的過程,但應(yīng)用于列而不是行。最后將生成的XLS文件保存到本地磁盤中
需要注意的是,單元格合并可能導(dǎo)致數(shù)據(jù)丟失或者格式上的不準(zhǔn)確性。特別是當(dāng)您試圖合并帶有邊框、樣式或注釋等屬性的單元格時請小心,這些屬性可能會丟失。
2.4 單元格對齊
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("單元格對齊"); HSSFCellStyle style=workbook.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 style.setWrapText(true);//自動換行 style.setIndention((short)5);//縮進 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庫在Excel中設(shè)置單元格邊框及邊框顏色。在此代碼中,首先創(chuàng)建Workbook對象,然后在該工作簿上創(chuàng)建一個名為“Test”的工作表Sheet。接著,在該工作表的第一行創(chuàng)建一個單元格,并設(shè)置該單元格的值為“設(shè)置邊框”。
然后,通過createCellStyle()方法創(chuàng)建一個HSSFCellStyle對象并將其賦值給style變量。接著調(diào)用setBorderXXX()方法來設(shè)置不同邊框的樣式,包括上、下、左和右邊框的線條類型和寬度以及沿邊框的顏色。最后,將創(chuàng)建的樣式應(yīng)用于單元格上,并將生成的XLS文件保存到本地磁盤中。
需要注意的是,上述代碼中指定的顏色索引可能與實際顯示的顏色略有不同。建議使用實際顏色名稱或RGB值來避免出現(xiàn)問題。另外,在設(shè)置邊框時,請確保單元格中的文本或數(shù)據(jù)不會被覆蓋或隱藏。
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è)置字號 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個字符寬度 row.setHeightInPoints(50);//設(shè)置行的高度是50個點 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
3.使用Excel公式
3.1 基本計算
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庫創(chuàng)建的Excel工作簿中設(shè)置單元格公式。在此代碼中,首先創(chuàng)建Workbook對象,然后在該工作簿上創(chuàng)建一個名為“Test”的工作表Sheet。接著,在該工作表的第一行創(chuàng)建三個單元格。
第一個單元格(A1)設(shè)置了公式“2+34”,用于計算結(jié)果。第二個單元格(B1)設(shè)置了值為10,作為第三個單元格(C1)使用公式“A1B1”進行乘法運算的一個操作數(shù)。需要注意的是,在設(shè)置公式時,需要按照Microsoft Excel的語法規(guī)則來編寫公式,且單元格引用需要按照[A,B]的格式表示。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,單元格的公式計算依賴于單元格的數(shù)據(jù)類型和格式,確保公式正確計算之前需要設(shè)定好相應(yīng)的數(shù)據(jù)類型;同時,也需小心處理不同單元格之間的對齊及其他隱藏相關(guā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)");//等價于"A1+C1" row.createCell(1).setCellFormula("sum(B1:D1)");//等價于"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();//日歷對象 HSSFCell cell=row.createCell(0); date.set(2011,2, 7); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個單元格開始時間設(shè)置完成 cell=row.createCell(1); date.set(2014,4, 25); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一個單元格結(jié)束時間設(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\"),\"日\")"); 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庫在Excel工作簿中設(shè)置單元格函數(shù)。在此代碼中,首先創(chuàng)建Workbook對象,然后在該工作簿上創(chuàng)建一個名為“Test”的工作表Sheet。接著,在該工作表的第一行中創(chuàng)建四個單元格。
第一個單元格(A1)設(shè)置了文本值"abcdefg",用于進行字母大小寫轉(zhuǎn)換;而第二個單元格(B1)設(shè)置了文本值"aa bb cc dd ee fF GG",也用于類似的轉(zhuǎn)換操作。第三個單元格(D1)設(shè)置了公式 "UPPER(A1)",用于將第一個單元格的文本轉(zhuǎn)換為大寫字母。相應(yīng)地,第四個單元格(E1)設(shè)置了公式 "PROPER(B1)" ,用于將第二個單元格的文本轉(zhuǎn)換為每個單詞首字母大寫,其余小寫的格式。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在設(shè)置函數(shù)時,需要按照Microsoft Excel的語法規(guī)則來編寫公式,且單元格引用需要按照[A,B]的格式表示;同時,請注意命名約定及函數(shù)參數(shù)個數(shù)、類型等相關(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("公式計算結(jié)果:"+cell.getNumericCellValue()); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//關(guān)閉文件流 System.out.println("OK!"); } }
4.使用圖形
4.1 畫線
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è)置圖形類型 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庫在Excel工作簿中插入一條線條。在此代碼中,首先創(chuàng)建Workbook對象,然后在該工作簿上創(chuàng)建一個名為“Test”的工作表Sheet。接著,用 createDrawingPatriarch() 方法獲取用于包含圖形元素的對象,再使用 createSimpleShape() 創(chuàng)建一個簡單形狀,并指定其描點的位置及大小。
在此示例中,HSSFClientAnchor對象定義要插入線條的起始和結(jié)束坐標(biāo)。然后,通過設(shè)置HSSFSimpleShape對象的參數(shù)來構(gòu)造直線。其中, setShapeType() 方法用于設(shè)置圖形類型,這里選擇直線,setLineStyle() 方法用于設(shè)置直線樣式,這里選擇實線;而 setLineWidth() 方法用于設(shè)置線條寬度,采用POI內(nèi)置的長度單位,以1/12700英寸為基礎(chǔ)計算。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在進行圖形元素設(shè)置時,請注意對應(yīng)的坐標(biāo)系,特別是行列數(shù)目等相關(guān)細(xì)節(jié)。
4.2 畫矩形
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 畫圓形
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è)置圖片類型 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 畫網(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(); //因為HSSFClientAnchor中dx只能在0-1023之間,dy只能在0-255之間,這里采用比例的方式 double xRatio = 1023.0 / (linesCount * 10); double yRatio = 255.0 / (linesCount * 10); // 畫豎線 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; } // 畫橫線 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);//讀取圖片到二進制數(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();//自動調(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庫在Excel工作簿中凍結(jié)指定的行和列。在此代碼中,首先創(chuàng)建 Workbook 對象,然后在該工作簿上創(chuàng)建一個名為“Test0”的工作表 Sheet。接著,使用 createFreezePane() 方法來設(shè)置要凍結(jié)的行和列。
在此示例中,使用的 createFreezePane() 方法的參數(shù)分別是:凍結(jié)列數(shù)、凍結(jié)行數(shù)(即滾動區(qū)域頂部的可見行數(shù))、右邊區(qū)域的左側(cè)列數(shù)、下方區(qū)域的頂部行數(shù)。這里將從第4行、第3列開始凍結(jié),并分別向右15列、向下25行。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在進行createFreezePane()方法設(shè)置時,請確??梢妳^(qū)域以及凍結(jié)列數(shù)、行數(shù)參數(shù)的設(shè)定符合預(yù)期。
Apache Poi是一個開源項目,由Apache軟件基金會維護,幾乎成為了Java開發(fā)人員中操作Excel的事實標(biāo)準(zhǔn)。通過掌握本文所提供的基礎(chǔ)知識、代碼示例和最佳實踐,讀者們應(yīng)該能夠開始使用Apache Poi來進行Excel文件操作,并基于自己的需要創(chuàng)造出更多有效的使用案例。
以上就是Java使用Apache POI操作Excel詳解的詳細(xì)內(nèi)容,更多關(guān)于Java操作Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Elasticsearch如何把一個索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02學(xué)會Java字節(jié)碼指令,成為技術(shù)大佬
Java 字節(jié)碼指令是 JVM 體系中非常難啃的一塊硬骨頭,我估計有些讀者會有這樣的疑惑,“Java 字節(jié)碼難學(xué)嗎?我能不能學(xué)會???”本文帶領(lǐng)大家一探究竟,幫助大家搞懂java底層代碼如何執(zhí)行2021-08-08使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04Java Swing 只關(guān)閉當(dāng)前窗體的實現(xiàn)
這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11