Java使用Apache POI操作Excel詳解
在Java中操作Excel是日常工作中經(jīng)常遇到的問(wèn)題。使用Apache Poi是一種流行且廣泛使用的方式,它提供了各種庫(kù)和工具,可以幫助開發(fā)人員直接從Java代碼中讀取、寫入和處理Excel文件。本篇文章將詳細(xì)介紹如何使用Apache Poi來(lái)進(jìn)行Excel文件操作,在這里,我們著重講解Apache Poi的基礎(chǔ)知識(shí)、如何讀取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)建和操作一個(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文件保存到本地磁盤中
需要注意的是,該代碼中提供的文件路徑僅適用于特定電腦上的特定位置,而實(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è)置中文大寫格式--使用自定義的格式
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)指定行號(hào)和列號(hào)以及最后單元格的行號(hào)和列號(hào)。最后使用addMergedRegion方法來(lái)指定要合并的單元格范圍。另外,在該行的第6個(gè)單元格上繼續(xù)重復(fù)相同的過(guò)程,但應(yīng)用于列而不是行。最后將生成的XLS文件保存到本地磁盤中
需要注意的是,單元格合并可能導(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è)置不同邊框的樣式,包括上、下、左和右邊框的線條類型和寬度以及沿邊框的顏色。最后,將創(chuàng)建的樣式應(yīng)用于單元格上,并將生成的XLS文件保存到本地磁盤中。
需要注意的是,上述代碼中指定的顏色索引可能與實(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)編寫公式,且單元格引用需要按照[A,B]的格式表示。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,單元格的公式計(jì)算依賴于單元格的數(shù)據(jù)類型和格式,確保公式正確計(jì)算之前需要設(shè)定好相應(yīng)的數(shù)據(jù)類型;同時(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è)單元格開始時(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)行字母大小寫轉(zhuǎn)換;而第二個(gè)單元格(B1)設(shè)置了文本值"aa bb cc dd ee fF GG",也用于類似的轉(zhuǎn)換操作。第三個(gè)單元格(D1)設(shè)置了公式 "UPPER(A1)",用于將第一個(gè)單元格的文本轉(zhuǎn)換為大寫字母。相應(yīng)地,第四個(gè)單元格(E1)設(shè)置了公式 "PROPER(B1)" ,用于將第二個(gè)單元格的文本轉(zhuǎn)換為每個(gè)單詞首字母大寫,其余小寫的格式。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在設(shè)置函數(shù)時(shí),需要按照Microsoft Excel的語(yǔ)法規(guī)則來(lái)編寫公式,且單元格引用需要按照[A,B]的格式表示;同時(shí),請(qǐng)注意命名約定及函數(shù)參數(shù)個(gè)數(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("公式計(jì)算結(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庫(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è)置圖形類型,這里選擇直線,setLineStyle() 方法用于設(shè)置直線樣式,這里選擇實(shí)線;而 setLineWidth() 方法用于設(shè)置線條寬度,采用POI內(nèi)置的長(zhǎng)度單位,以1/12700英寸為基礎(chǔ)計(jì)算。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在進(jìn)行圖形元素設(shè)置時(shí),請(qǐng)注意對(duì)應(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();
//因?yàn)镠SSFClientAnchor中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);//讀取圖片到二進(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ū)域頂部的可見行數(shù))、右邊區(qū)域的左側(cè)列數(shù)、下方區(qū)域的頂部行數(shù)。這里將從第4行、第3列開始凍結(jié),并分別向右15列、向下25行。
最后,將生成的XLS文件保存到本地磁盤中,并關(guān)閉輸出流。
需要注意的是,在進(jìn)行createFreezePane()方法設(shè)置時(shí),請(qǐng)確保可見區(qū)域以及凍結(jié)列數(shù)、行數(shù)參數(shù)的設(shè)定符合預(yù)期。
Apache Poi是一個(gè)開源項(xiàng)目,由Apache軟件基金會(huì)維護(hù),幾乎成為了Java開發(fā)人員中操作Excel的事實(shí)標(biāo)準(zhǔn)。通過(guò)掌握本文所提供的基礎(chǔ)知識(shí)、代碼示例和最佳實(shí)踐,讀者們應(yīng)該能夠開始使用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-04
Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)
這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Mybatis攔截器實(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

