Java使用Apache POI操作Excel详解

 更新时间:2023年06月12日 15:31:39   作者:掉头发的王富贵  
在Java中操作Excel是日常工作中经常遇到的问题,而Apache Poi是一种流行且广泛使用的方式,它提供了各种库和工具,所以本文就来详细如何使用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 Poi是一个开源项目,由Apache软件基金会维护,几乎成为了Java开发人员中操作Excel的事实标准。通过掌握本文所提供的基础知识、代码示例和最佳实践,读者们应该能够开始使用Apache Poi来进行Excel文件操作,并基于自己的需要创造出更多有效的使用案例。

以上就是Java使用Apache POI操作Excel详解的详细内容,更多关于Java操作Excel的资料请关注脚本之家其它相关文章!

相关文章

  • Java里的static在Kotlin里如何实现

    Java里的static在Kotlin里如何实现

    这篇文章主要介绍了Java里的static在Kotlin里如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java简单实现多线程及线程池实例详解

    java简单实现多线程及线程池实例详解

    这篇文章主要为大家详细介绍了java简单实现多线程,及java爬虫使用线程池实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 浅谈Java泛型让声明方法返回子类型的方法

    浅谈Java泛型让声明方法返回子类型的方法

    下面小编就为大家带来一篇浅谈Java泛型让声明方法返回子类型的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 永中文档在线转换服务Swagger调用说明

    永中文档在线转换服务Swagger调用说明

    这篇文章主要为大家介绍了永中文档在线转换服务Swagger调用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java中的DecimalFormat用法解析

    Java中的DecimalFormat用法解析

    这篇文章主要介绍了Java中的DecimalFormat用法解析,DecimalFormat是Java中用于格式化数字的类,它提供了一种简单而灵活的方式来格式化数字,包括指定小数位数、千位分隔符、货币符号等,需要的朋友可以参考下
    2023-10-10
  • Java编程实现五子棋人人对战代码示例

    Java编程实现五子棋人人对战代码示例

    这篇文章主要介绍了Java编程实现五子棋人人对战代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • 关于Jackson的JSON工具类封装 JsonUtils用法

    关于Jackson的JSON工具类封装 JsonUtils用法

    这篇文章主要介绍了关于Jackson的JSON工具类封装 JsonUtils用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • file.mkdir()、file.mkdirs()和file.createNewFile()的区别

    file.mkdir()、file.mkdirs()和file.createNewFile()的区别

    本文主要介绍了file.mkdir()、file.mkdirs()和file.createNewFile()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java连接mysql数据库实现单条插入和批量插入

    java连接mysql数据库实现单条插入和批量插入

    这篇文章主要为大家详细介绍了java连接mysql数据库实现单条插入和批量插入,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java设计模式之策略模式深入刨析

    Java设计模式之策略模式深入刨析

    策略模式属于Java 23种设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。本文将通过示例详细讲解这一模式,需要的可以参考一下
    2022-05-05

最新评论