Java操作Excel(Apache Poi详解)

Java 整合Apache POI 以及 Easy Excel 操作 Excel 文件 Java领域解析、生成操作Excel一般有 Apachepoi与Easy Excel 两种方法。Apachepoi存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。所以我们先介绍一下Easy Excel方法EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。 阅读详情

在Java中操作Excel是日常工作中经常遇到的问题。使用Apache Poi是一种流行且广泛使用的方式,它提供了各种库和工具,可以帮助开发人员直接从Java代码中读取、写入和处理Excel文件。本篇文章将详细介绍如何使用Apache Poi来进行Excel文件操作,在这里,我们着重讲解Apache Poi的基础知识、如何读取Excel文件以及如何编写数据到Excel文件。

1.导入依赖

xml复制代码        
            org.apache.poi
            poi
            3.8
        

2.Excel表单元格控制

2.1 最基础的行列控制

java复制代码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 设置格式

java复制代码
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 合并单元格

java复制代码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 单元格对齐

java复制代码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 设置边框

java复制代码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 设置字体

java复制代码
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 设置图案样式

java复制代码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 设置宽度和高度

java复制代码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 基本计算

java复制代码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行数

java复制代码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 日期函数

java复制代码
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 字符串函数

java复制代码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 获取返回值

java复制代码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 画线

java复制代码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 画矩形

java复制代码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 画圆形

java复制代码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 画网格

java复制代码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 插入图片

java复制代码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行列操作

5.1 锁定列

java复制代码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文件操作,并基于自己的需要创造出更多有效的使用案例。

使用Apache POI实现Java操作Office文件:从Excel、Word到PPT模板写入 Apache POI为Java开发者提供了强大的Office文件操作能力,无论是基础的数据写入,还是复杂的模板定制,都能通过灵活组合API实现。掌握POI的核心组件(XSSF/XWPF/XSLF)和元素定位技巧,可高效解决企业级开发中的文档自动化需求。延伸思考:结合POI-TL等工具可实现更复杂的Word模板引擎,而面对超大数据量Excel处理时,需合理选择HSSF(旧格式)、XSSF(新格式)或SXSSF(流式)方案。建议在实际项目中根据文件格式、数据量和功能复杂度选择最佳实现方式。 阅读详情

相关推荐

Java 操作 Excel 全方位指南:从入门到避坑,基于 Apache POI

这篇技术文章全面介绍了使用Apache POI库在Java中操作Excel文件的方法。文章分为两个主要部分:第一部分详细解析了Apache POI的核心依赖关系,特别是poi-ooxml和poi-ooxml-schemas的作用与区别;第二部分通过一个实际案例,演示了如何从数据库导出用户数据到格式化的Excel报表,包括创建工作簿、设置样式、合并单元格、自动调整列宽等实用技巧。文章提供了完整的代码示例,特别适合需要处理Excel报表的Java开发者阅读,既能帮助理解POI的工作原理,又能快速应用到实际项目中

qq_32358423的博客 1209

java操作excel

jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。但jExcelAPI对中文支持非常好,API是纯Java的, 并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。sheet.addCell(new Label(0, 0, "第二页的测试数据"));利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,i < rownum;

m0_62396648的博客 4194

Java中的Apache POI库:Excel操作从未如此简单

Apache POI是一个用于处理Microsoft Office格式文件的开源Java库。POI的“POI”其实是“Poor Obfuscation Implementation”的缩写,但它真正的含义是“Point Of Interest”,因为这个项目最初是为了处理Office文件中的特定部分(如图表)而创建的。Apache POI可以处理多种文件格式,包括.xls(Excel 97-2003)和.xlsx(Excel 2007及以上版本)。🔍。

java专栏 1609

Java操作Excel

用excel记录和跟进工作的时候,设置背景颜色,以此让记录更加突出,方便查看,但是手动修改背景颜色一来麻烦容易漏,也可能颜色不统一,我们可以试试使用excel的条件格式,根据状态来自动变更整行背景颜色。在公式栏里输入公式:=$C2="完成",公式表示C列对应第2行开始等于完成时,触发条件。1、打开Excel,按alt+O,然后按D,点击“新建规则”,选择使用公式设置单元格。可以,重复点击“新建规则”,追加多条不同的规则。下图:应用于:代表此格式作用的范围。格式选择填充一个背景颜色。

杀神lwz的博客 3412

Apache POI:Java操作Excel文件的利器

Apache POI是一个开源的Java库,广泛应用于读取和修改Microsoft Office格式的文件,尤其是Excel、Word和PowerPoint。它是利用Java处理Microsoft Office文档最流行的库之一,使得在Java应用程序中操作这些文件变得可行。Apache POI提供了一系列的API,允许开发者创建、修改、显示和打印Microsoft Office文档。对于Excel文件,POI支持从Excel 97版本到最新版的所有格式。

weixin_30218749的博客 1357

使用Apache POI库进行Java操作Excel教程

Apache POI是一个流行的开源Java库,用于处理Microsoft Office文档格式,特别是Excel、Word和PowerPoint文件。它的主要目的是让Java程序能够读取和修改这些文件,而不必依赖于原生的Microsoft Office应用程序。Apache POI为Java开发者提供了一套丰富的API,使得在Java中创建、编辑和维护办公文档变得简单。Apache POI主要包含以下组件:HSSF:用于处理Excel文件格式(.xls)。XSSF。

weixin_35749545的博客 723

java 操作 Excel

因此这两种文件格式的处理方式并不一样。

m0_62056932的博客 2871

Java Apache POI实现Excel指定行复制操作

本文还有配套的精品资源,点击获取 简介:Apache POI是用于处理Microsoft Office文件格式的Java库,特别是在Excel文件中。文章详细说明了如何使用Apache POI在Java中复制指定行数的Excel表格内容,包括行内容和样式。通过创建Workbook、Sheet、Row和Cell对象,遍历指定行数进行复制,并展示如何保存修改后的文件。这对于自动...

weixin_31659095的博客 1908

Java处理Excel

1 引言 Excel是我们平时工作中比较常用的用于存储二维表数据的。Java中有两种常用的方法操作Excel:jxl和poi。 其中,在小数据量时jxl快于poi,在大数据量时poi要快于jxl。但差距都不明显。 本文使用poi进行处理Excel 2 POI的maven依赖 &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;/gro...

书香水墨 2154

Java操作Excel的Apache POI工具类深入解析

Apache POI是处理Microsoft Office文档的一个Java库,它允许开发者创建、修改、显示和打印各种Microsoft Office文档。对于Java开发者而言,它是一个非常重要的库,特别是在处理Excel文件时,无论是读取还是写入数据。Apache POI提供了易于理解的API,使得操作Excel文件变得简单。单元格的样式决定了数据的显示外观,比如字体大小、颜色、对齐方式等。

weixin_36122351的博客 459

保姆级教程:在Ubuntu 20.04上从源码编译Apollo自动驾驶平台(含GPU环境配置)

本文提供了一份详细的Ubuntu 20.04上从源码编译Apollo自动驾驶平台的保姆级教程,包括GPU环境配置、Docker部署和编译构建等关键步骤。通过实战经验和避坑指南,帮助开发者高效完成Apollo平台的编译和验证,适用于自动驾驶技术研究和应用开发。

weixin_30876945的博客 409

JAVA操作Excel文件: Apache POI

JAVA操作Excel

SunnerChen的博客 1万+

Agent测试框架Harbor指南

Harbor是一个AI Agent单元测试框架,用于自动化测试AI代理在容器环境中的任务执行能力。它支持18+种AI代理,通过沙箱隔离和自动验证机制评估任务完成情况。任务必须具有可编程验证的输出结果,适合代码、数据、系统等可量化任务,不适合创意写作等主观任务。Harbor采用CLI操作方式,核心架构包含Job管理、Trial执行和验证器三个层级,执行流程包括环境启动、Agent执行和结果验证。任务目录包含指令文件、配置文件、Docker环境定义和测试脚本等必需组件,通过测试脚本自动判断任务完成质量。

loo_Charles_ool的博客 1404

EasyExcel 与 Apache POI:Java 操作 Excel 的详解

EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 操作库。它在传统的 Excel 操作库(如 Apache POI)基础上进行了封装和优化,提供了更简洁的 API 和更高的性能,尤其是在处理大数据量的 Excel 文件时表现出色。Apache POI 是一个开源的 Java 库,用于操作各种 Microsoft Office 格式的文件,包括 Excel、Word、PowerPoint 等。它提供了低级 API 和高层 API,可以进行文件的读取、写入、创建、修改等操作。

技术驱动,分享互联网软件的那些事儿。关注我,获取有深度、有温度的技术内容,开启你的技术之旅。 1587

避坑指南:Ubuntu 22.04上源码编译Autoware.universe(Humble版)的完整流程与常见错误修复

本文详细介绍了在Ubuntu 22.04上源码编译Autoware.universe(Humble版)的完整流程与常见错误修复方法。从环境准备、依赖安装到编译优化,提供了实用的避坑指南和解决方案,帮助开发者高效完成安装并避免常见问题。特别针对源码安装过程中的疑难杂症给出了具体修复建议。

weixin_33712987的博客 382

Spring Boot 调用豆包大模型如何开启联网搜索?

场景推荐方案有权限创建 Bot + 需强集成✅ 使用bot-xxxx无 Bot 权限 / 追求通用性✅ 自行集成搜索引擎 + 普通豆包模型仅需基础对话❌ 无需考虑联网豆包大模型确实支持联网搜索,但前提是:你用的是“智能体 Bot”,且它被配置了“网页搜索”插件,并调用正确的 API 端点。希望本文能帮你少走弯路,快速构建出真正“知天下事”的智能助手!

lpfasd123的博客 1123

Java通过Apache POI操作Excel

读取单元格数据之前,可以先检查该单元格的数据类型。如果它是数字类型,那么你应该读取它的数值值;如果它是文本类型,那么你应该读取它的字符串值。这样可以避免数据类型不匹配的问题。

IT__learning的博客 746

游戏客户端开发工程师笔试题

1、已知有一个关键字序列:(27,23,34,14,1,55, 20,19,85,83,10,68)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为(4、出现死锁时,除了可以采用资源剥夺的方法解决死锁问题外,还可以使用的方法是()是被限定只能在表的一端进行插入运算,在另一端进行删除运算的线性表.5、大端模式,是指数据的高字节保存在内存的(3、在二叉查找树中, 最好情况下复杂度为。)地址中,而数据的低字节保存在内存的(

博客 1873

java poi 上传excel文件名称_Java Apache POI 操作 Excel 导入

Java 可以通过 Apache POI 操作 Excel 的导入导出Apache POI 是一套操作 Microsoft Office 套件的开源 Java API更多精彩官网依赖要使用 Apache POI 的功能需要引入以下两个 jar 包操作 Excel 2003 (.xls) 及之前的版本,只用导入 poi 即可操作 Excel 2007 (.xlsx) 及以后的版本,则还需要导入 po...

weixin_34530164的博客 349

在 SAP S/4HANA 本地部署和私有云里预览 RAP Travel App:为什么 ADT 发不出去,以及如何用 /IWFND/V4_ADMIN 正确发布 OData V4 Service

在SAP S/4HANA On-Premise/Private Cloud环境中,通过ADT直接发布RAP服务的本地端点常会失效。这是因为系统治理策略要求必须通过SAP Gateway Foundation(事务码/IWFND/V4_ADMIN)发布Service Group,而非开发者本机测试模式。本文详解了该流程的必要性:Service Group是OData V4服务的发布单元,涉及后端登记(/IWBEP/V4_ADMIN)和前端发布(/IWFND/V4_ADMIN)两个环节。提供了从ADT跳转SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

Chat*** Plus限时免费1个月!原价20美元/月的顶配功能

BUG猿的博客 7278

java用org.apache.poi包操作excel

一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。 二.HSSF概况 HSSF 是Ho

linking530的专栏 663

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2202

java使用poi操作excel文件_使用 java apache poi 操作 excel xlsx 文件

工作中临时需要对各种订单量进行简单的统计分析,为了方便简单学习了apache poi 对 xlsx 文件的基本操作,简单记录1. 引包org.apache.poipoi-ooxml4.1.22. 创建文件public static void main(String[] args) {// 创建文件,创建工作薄File xlsFile = new File("C:/demo/demo.xlsx");...

weixin_29196891的博客 433

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: Redis 网络模型
下一篇: SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值