java采取poi处理excel

本文介绍了在Java中使用Apache POI库处理Excel文件的基本操作,包括读写、样式设置、隐藏行列等功能,并提到了针对复杂格式需求时,可以使用jxls进行模板填充的便利性。此外,还提及了使用POI下载Excel时可能出现的浏览器兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

平时需要处理excel文件,一般有2种选择:apache的poi和jxl。jxl一般对文件处理支持不太好,主要还是使用poi更多一些。做个简单介绍。
注:含jxls的简单处理

简介poi

poi可以处理excel文件,同时还能处理word和ppt文件。可从apache官网进行查看。以下的内容均为官网所得。
处理excel时,有HSSF、XSSF等区别。简单就是HSSF支持excel97等以后,XSSF支持excel2007等以后。具体可以搜索查看excel区别和HSSF、XSSF区别。

HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现
XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现
POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API—-SXSSF

项目依赖maven

poi一般依赖几个文件,poi、poi-ooxml、poi-schemas等等。具体版本可去maven仓库查询。
maven依赖如下:

 <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.1.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.1.4</version>
            </dependency>
            <dependency>
                <groupId>net.sf.jxls</groupId>
                <artifactId>jxls-core</artifactId>
                <version>1.0.5</version>
            </dependency>

概述

以下是简单的写入/写出excel例子:

//      Workbook wb = WorkbookFactory.create(inputStream);
        Workbook wb = new HSSFWorkbook();   //new XSSFWorkbook();
        Sheet sheet = wb.createSheet("new sheet");  //sheet = excel的工作表
        Row row = sheet.createRow(0);   //row = excel的行
        Cell cell = row.createCell(0);  //cell = 单元格
        cell.setCellValue(123); //  设置值

        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();

直接可以运行,很好理解。还有其他的很多地方,都是基于此补充。
1.Cell可以设置样式,使用CellStyle进行设置。

        Cell cell = row.createCell(column);
        cell.setCellValue("Align It");
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(halign);
        cellStyle.setVerticalAlignment(valign);
        cell.setCellStyle(cellStyle);

2.Cell可以设置字体颜色。

         // Create a new font and alter it.
        Font font = wb.createFont();
        font.setFontHeightInPoints((short)24);
        font.setFontName("Courier New");
        font.setItalic(true);
        font.setStrikeout(true);

        // Fonts are set into a style so create a new one to use.
        CellStyle style = wb.createCellStyle();
        style.setFont(font);

3.创建Workbook时,可采取直接创建或WorkFactory创建,建议第二种。第二种会进行判断,采取哪种方式创建。

Workbook wb = WorkbookFactory.create(inputStream);
Workbook wb = new HSSFWorkbook();   //new XSSFWorkbook();

4.对于有些地方的使用可能还需要createionHelper处理。

CreationHelper creationHelper = wb.getCreationHelper();  //wb = Wookbook

5.单列、单行可以进行隐藏操作

sheet.setColumnHidden(2,true);
row.setZeroHeight(true);

6.可以设置全局的宽高,不过试过,excel导出会有问题。可以参考下。

    /**
     * 设置全局默认的Sheet样式
     * 注:一旦设置了这些属性,如果某一行或者某一列没有设置宽度,就会使用默认宽度或高度
     *
     * @param sheet
     * @param defaultWeight 参数的单位是1/256个字符宽度,也就是说,所有设置的宽度需要*256
     * @param defaultHeight 参数的单位是1/20个点,也就说,所有的设置宽度需要*20
     */
    public static void setDefaultSheet(Sheet sheet, int defaultWeight, int defaultHeight) {
        sheet.setDefaultColumnWidth(defaultWeight * 256);
        sheet.setDefaultRowHeight((short) (defaultHeight * 20));
//      sheet.setDefaultRowHeightInPoints();  //默认是点,单位是height的20倍
    }

注:部分代码样式如下

   Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);    // 将字体大小设置为**px
        font.setFontName("宋体");
        font.setColor(IndexedColors.GREEN.getIndex());
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);
        cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        cellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
        cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
        cellStyle.setBorderRight(CellStyle.BORDER_THIN);

基本的使用就是以上了,对于详细的可参考apache的poi的介绍。有对于部分细节的说明。
地址:https://poi.apache.org/spreadsheet/quick-guide.html

简介jxls

当需要输出一定格式的excel样式时,我们可能需要指定输出的格式,多少行,多少列,数据如何存放等等。而这些操作一般特别繁琐。需要我们不断循环进行,最后才能输出看着还算美观的excel样式(包含数据)。
采取jxls,就能根据提前制作好的excel样式直接填充我们需要的数据,特别方便快速,可以学习下。
项目依赖如上所述。

概述

一般我们需要向一些模版塞入不少数据,而这些模版需要进行简单设计。如下:
这里写图片描述

这里抛去代码,需要设计好id,名称,还有下面的单元格样式等等。这些设计繁琐了,采取如下jxls代码,就能简单进行代码的填充处理了。详细参考官网

    public static InputStream makeReportFromTemplet(String templateFileName, Map beans) {
        Configuration config = new Configuration();
        XLSTransformer transformer = new XLSTransformer(config);
        InputStream is = null;
        InputStream excelStream = null;
        Workbook workBook = null;
        try {
            is = new FileInputStream(templateFileName);
            try {
                workBook = transformer.transformXLS(is, beans);
            } catch (ParsePropertyException e) {
                e.printStackTrace();
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            }
            // 产生POI输出流
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            workBook.write(os);
            excelStream = new ByteArrayInputStream(os.toByteArray());
            is.close();
        } catch (IOException ie) {
            ie.printStackTrace();
        }
        return excelStream;
    }

参数:templateFileName 就是提前设计好的空白的excel样式,beans就是需要填充的数据。
beans数据:

  Map<String, Object> beans = new HashMap<String, Object>();
        User user1 = new User();
        user1.setId(1L);
        user1.setName("aaa");
        User user2 = new User();
        user2.setId(2L);
        user2.setName("bbb");
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);

最后将结果输出到指定文件即可。效果如下:
这里写图片描述

无需设计样式,即可展示出数据。至于excel中添加的代码,可参考官网说明。(翻墙突然不成功了,不罗列了)

常见标签

1.<jx:forEach var=" ? " varStatus="status"> </jx:forEach>  
注:用于迭代, 属性是var;varStatus待确定
2. <jx:if test="${ ? }" > </jx:if> 
注:用于逻辑判断, 有一个属性test
3. $[sum(position)]
注:求和
4. $[min(position)] 
注:求最大值
5. $[max(position)] 
注:求最小值
6. $[average(position)]
注:求平均值
7. $[count(position)]
注:求数量

异常

1.采取poi下载excel时,部分浏览器会报错,如下:

ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
    at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:334)
    at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:283)
    at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:108)

暂时发现出现在部分浏览器上面,原因未知,待查看。


参考:
http://blog.youkuaiyun.com/zdp072/article/details/30310473

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值