Java使用Apache POI操作Excel详解
作者:掉头发的王富贵
在Java中操作Excel是日常工作中经常遇到的问题。使用Apache Poi是一种流行且广泛使用的方式,它提供了各种库和工具,可以帮助开发人员直接从Java代码中读取、写入和处理Excel文件。本篇文章将详细介绍如何使用Apache Poi来进行Excel文件操作,在这里,我们着重讲解Apache Poi的基础知识、如何读取Excel文件以及如何编写数据到Excel文件。
1.导入依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency>
2.Excel表单元格控制
2.1 最基础的行列控制
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); //创建工作表(Sheet) HSSFSheet sheet = workbook.createSheet("Test"); // 创建行,从0开始 HSSFRow row = sheet.createRow(0); // 创建行的单元格,也是从0开始 HSSFCell cell = row.createCell(0); // 设置单元格内容 cell.setCellValue("CsdnerM"); // 设置单元格内容,重载 row.createCell(1).setCellValue(false); // 设置单元格内容,重载 row.createCell(2).setCellValue(new Date()); // 设置单元格内容,重载 row.createCell(3).setCellValue(12.345); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
这段 Java 代码演示了如何创建和操作一个Excel文件。代码使用Apache POI库,它提供了创建和修改Excel文件的功能。在此代码中,先创建Workbook对象,然后在其上创建一个名为“Test”的工作表Sheet,并在该表中插入一行。接着,通过创建Row对象和随后的Cell对象,并使用setCellValue()方法来设置单元格中的数据。最后将生成的XLS文件保存到本地磁盘中
需要注意的是,该代码中提供的文件路径仅适用于特定电脑上的特定位置,而实际应用程序需要使用相应的路径。
2.2 设置格式
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row = sheet.createRow(0); //设置日期格式--使用Excel内嵌的格式 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); //设置保留2位小数--使用Excel内嵌的格式 cell = row.createCell(1); cell.setCellValue(12.3456789); style = workbook.createCellStyle(); style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00")); cell.setCellStyle(style); //设置货币格式--使用自定义的格式 cell = row.createCell(2); cell.setCellValue(12345.6789); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0")); cell.setCellStyle(style); //设置百分比格式--使用自定义的格式 cell = row.createCell(3); cell.setCellValue(0.123456789); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("0.00%")); cell.setCellStyle(style); //设置中文大写格式--使用自定义的格式 cell = row.createCell(4); cell.setCellValue(12345); style = workbook.createCellStyle(); style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0")); cell.setCellStyle(style); //设置科学计数法格式--使用自定义的格式 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();//关闭文件流 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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何使用Apache POI库在Excel文件中合并单元格。在此代码中,首先创建Workbook对象,然后在该工作簿上创建一个名为“Test”的工作表Sheet,并在该表中插入一行。接着,在该行的第0个单元格上调用createCell()方法以创建单元格对象,并将其内容设置为“合并列”。然后定义需要合并的单元格区域,使用CellRangeAddress类来指定行号和列号以及最后单元格的行号和列号。最后使用addMergedRegion方法来指定要合并的单元格范围。另外,在该行的第6个单元格上继续重复相同的过程,但应用于列而不是行。最后将生成的XLS文件保存到本地磁盘中
需要注意的是,单元格合并可能导致数据丢失或者格式上的不准确性。特别是当您试图合并带有边框、样式或注释等属性的单元格时请小心,这些属性可能会丢失。
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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//文本旋转,这里的取值是从-90到90,而不是0-180度。 cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
2.5 设置边框
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell=row.createCell(1); cell.setCellValue("设置边框"); 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();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何使用Apache POI库在Excel中设置单元格边框及边框颜色。在此代码中,首先创建Workbook对象,然后在该工作簿上创建一个名为“Test”的工作表Sheet。接着,在该工作表的第一行创建一个单元格,并设置该单元格的值为“设置边框”。
然后,通过createCellStyle()方法创建一个HSSFCellStyle对象并将其赋值给style变量。接着调用setBorderXXX()方法来设置不同边框的样式,包括上、下、左和右边框的线条类型和宽度以及沿边框的颜色。最后,将创建的样式应用于单元格上,并将生成的XLS文件保存到本地磁盘中。
需要注意的是,上述代码中指定的颜色索引可能与实际显示的颜色略有不同。建议使用实际颜色名称或RGB值来避免出现问题。另外,在设置边框时,请确保单元格中的文本或数据不会被覆盖或隐藏。
2.6 设置字体
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell = row.createCell(1); cell.setCellValue("设置字体"); HSSFCellStyle style = workbook.createCellStyle(); HSSFFont font = workbook.createFont(); font.setFontName("华文行楷");//设置字体名称 font.setFontHeightInPoints((short)28);//设置字号 font.setColor(HSSFColor.RED.index);//设置字体颜色 font.setUnderline(FontFormatting.U_SINGLE);//设置下划线 font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标 font.setStrikeout(true);//设置删除线 style.setFont(font); cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
2.7 设置图案样式
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row=sheet.createRow(0); HSSFCell cell = row.createCell(1); HSSFCellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(HSSFColor.GREEN.index);//设置图案颜色 style.setFillBackgroundColor(HSSFColor.RED.index);//设置图案背景色 style.setFillPattern(HSSFCellStyle.SQUARES);//设置图案样式 cell.setCellStyle(style); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
2.8 设置宽度和高度
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row = sheet.createRow(1); HSSFCell cell = row.createCell(1); cell.setCellValue("123456789012345678901234567890"); sheet.setColumnWidth(1, 31 * 256);//设置第一列的宽度是31个字符宽度 row.setHeightInPoints(50);//设置行的高度是50个点 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet) HSSFRow row = sheet.createRow(0); HSSFCell cell = row.createCell(0); cell.setCellFormula("2+3*4");//设置公式 cell = row.createCell(1); cell.setCellValue(10); cell = row.createCell(2); cell.setCellFormula("A1*B1");//设置公式 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何在使用Apache POI库创建的Excel工作簿中设置单元格公式。在此代码中,首先创建Workbook对象,然后在该工作簿上创建一个名为“Test”的工作表Sheet。接着,在该工作表的第一行创建三个单元格。
第一个单元格(A1)设置了公式“2+34”,用于计算结果。第二个单元格(B1)设置了值为10,作为第三个单元格(C1)使用公式“A1B1”进行乘法运算的一个操作数。需要注意的是,在设置公式时,需要按照Microsoft Excel的语法规则来编写公式,且单元格引用需要按照[A,B]的格式表示。
最后,将生成的XLS文件保存到本地磁盘中,并关闭输出流。
需要注意的是,单元格的公式计算依赖于单元格的数据类型和格式,确保公式正确计算之前需要设定好相应的数据类型;同时,也需小心处理不同单元格之间的对齐及其他隐藏相关问题。
3.2 sum行数
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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();//关闭文件流 System.out.println("OK!"); } }
3.3 日期函数
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//第一个单元格开始时间设置完成 cell=row.createCell(1); date.set(2014,4, 25); cell.setCellValue(date.getTime()); cell.setCellStyle(style);//第一个单元格结束时间设置完成 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();//关闭文件流 System.out.println("OK!"); } }
3.4 字符串函数
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何使用Apache POI库在Excel工作簿中设置单元格函数。在此代码中,首先创建Workbook对象,然后在该工作簿上创建一个名为“Test”的工作表Sheet。接着,在该工作表的第一行中创建四个单元格。
第一个单元格(A1)设置了文本值"abcdefg",用于进行字母大小写转换;而第二个单元格(B1)设置了文本值"aa bb cc dd ee fF GG",也用于类似的转换操作。第三个单元格(D1)设置了公式 "UPPER(A1)",用于将第一个单元格的文本转换为大写字母。相应地,第四个单元格(E1)设置了公式 "PROPER(B1)" ,用于将第二个单元格的文本转换为每个单词首字母大写,其余小写的格式。
最后,将生成的XLS文件保存到本地磁盘中,并关闭输出流。
需要注意的是,在设置函数时,需要按照Microsoft Excel的语法规则来编写公式,且单元格引用需要按照[A,B]的格式表示;同时,请注意命名约定及函数参数个数、类型等相关要素。
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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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创建的,则不必调用此方法 System.out.println("公式计算结果:"+cell.getNumericCellValue()); FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//设置图形类型 line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//设置图形样式 line.setLineWidth(6350);//在POI中线的宽度12700表示1pt,所以这里是0.5pt粗的线条。 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何使用Apache POI库在Excel工作簿中插入一条线条。在此代码中,首先创建Workbook对象,然后在该工作簿上创建一个名为“Test”的工作表Sheet。接着,用 createDrawingPatriarch() 方法获取用于包含图形元素的对象,再使用 createSimpleShape() 创建一个简单形状,并指定其描点的位置及大小。
在此示例中,HSSFClientAnchor对象定义要插入线条的起始和结束坐标。然后,通过设置HSSFSimpleShape对象的参数来构造直线。其中, setShapeType() 方法用于设置图形类型,这里选择直线,setLineStyle() 方法用于设置直线样式,这里选择实线;而 setLineWidth() 方法用于设置线条宽度,采用POI内置的长度单位,以1/12700英寸为基础计算。
最后,将生成的XLS文件保存到本地磁盘中,并关闭输出流。
需要注意的是,在进行图形元素设置时,请注意对应的坐标系,特别是行列数目等相关细节。
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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//设置边框样式 rec.setFillColor(255, 0, 0);//设置填充色 rec.setLineWidth(25400);//设置边框宽度 rec.setLineStyleColor(0, 0, 255);//设置边框颜色 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//设置图片类型 rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//设置边框样式 rec.setFillColor(255, 0, 0);//设置填充色 rec.setLineWidth(25400);//设置边框宽度 rec.setLineStyleColor(0, 0, 255);//设置边框颜色 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
4.4 画网格
public class Test00 { public static void main(String[] args) throws IOException { //文件路径 String filePath = "C:\\Users\\masiyi\\IdeaProjects\\demo\\src\\main\\resources\\test.xls"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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();//关闭文件流 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"; //创建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(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);//读取图片到二进制数组 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();//自动调节图片大小,图片位置信息可能丢失 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 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();// 创建Excel文件(Workbook) HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet) sheet.createFreezePane(2, 3, 15, 25);//冻结行列 FileOutputStream out = new FileOutputStream(filePath); //保存Excel文件 workbook.write(out); out.close();//关闭文件流 System.out.println("OK!"); } }
这段Java代码演示了如何使用Apache POI库在Excel工作簿中冻结指定的行和列。在此代码中,首先创建 Workbook 对象,然后在该工作簿上创建一个名为“Test0”的工作表 Sheet。接着,使用 createFreezePane() 方法来设置要冻结的行和列。
在此示例中,使用的 createFreezePane() 方法的参数分别是:冻结列数、冻结行数(即滚动区域顶部的可见行数)、右边区域的左侧列数、下方区域的顶部行数。这里将从第4行、第3列开始冻结,并分别向右15列、向下25行。
最后,将生成的XLS文件保存到本地磁盘中,并关闭输出流。
需要注意的是,在进行createFreezePane()方法设置时,请确保可见区域以及冻结列数、行数参数的设定符合预期。
Apache Poi是一个开源项目,由Apache软件基金会维护,几乎成为了Java开发人员中操作Excel的事实标准。通过掌握本文所提供的基础知识、代码示例和最佳实践,读者们应该能够开始使用Apache Poi来进行Excel文件操作,并基于自己的需要创造出更多有效的使用案例。
以上就是Java使用Apache POI操作Excel详解的详细内容,更多关于Java操作Excel的资料请关注脚本之家其它相关文章!