poi复杂excel的实现

一:前言

  最近帮一个朋友做excel的导出功能,对于我来说还是挺头疼,我看了下表格样式,对于我来说还是挺头疼的,想当年耗子刚刚出社会的时候做的第一份工作,第一份任务就是把把word转换为html,在这个过程中,尝试了太多方式,但是并不能保证所有的都能转换成功,复杂的word转换,依然会造成错乱。excel的导出我也还没去做过,设计到单元格的合并,我去看了看官方文档,其实也没看出什么名堂,然后就在网上查找了,下面记录下自己踩的坑吧,其实没用多久时间,从晚上八点开始做,三个小时完成,但是这之间做了很多实验。

二:内容

  先说网上搜索的结果,我搜了"hssfrow 合并单元格",找到了两篇文章结合

    (1):http://dacoolbaby.iteye.com/blog/1630957

    (2):http://blog.csdn.net/hehexiaoyou/article/details/37873131

先说我的测试,我把(1)中的代码弄到本地跑,但是一直报错,主要是

  

   //表示合并B2,B3
            sheet.addMergedRegion(new Region(
                     1, //first row (0-based)
                    (short)1, //first column  (0-based)
                     2, //last row (0-based)
                    (short)1  //last column  (0-based)
             ));    

主要是红色这个类,我查阅了下文档,并结合了(2)做了修改,贴上代码

package com.mouse.moon.frepoi;

import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
//测试复杂的单元格合并
public class TestFreMergedCells {

    public static void main(String[] args) throws IOException {
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet("new sheet");
                HSSFRow row = sheet.createRow(0);
                HSSFCell cell = row.createCell(0);
                //HSSFRow row = sheet.createRow(0);
                //HSSFCell cell = row.createCell(1);   cell.setCellValue("value");  这个代表设置值为(0,1)第1行第二列
                //设置值是(0,0)代表第1行第1列,如果你想到的是我既然合并了第一列的第一行和第二行,我是否可以设置(1,0,
                //你可以测试下,这个显然是不行的
                cell.setCellValue("第一行第二行合并,第一列");
                sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));

                //合并第二列的第一行第二行
                sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1));

                //1.生成字体对象
                HSSFFont font = wb.createFont();
                font.setFontHeightInPoints((short) 10);
                font.setFontName("新宋体");
                font.setColor(HSSFColor.BLUE.index);
                font.setBoldweight((short) 0.8);
                //2.生成样式对象
                HSSFCellStyle style = wb.createCellStyle();
                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                style.setFont(font); //调用字体样式对象
                style.setWrapText(true);
                //增加表格边框的样式 例子
               style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);
               style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);
               style.setTopBorderColor(HSSFColor.GOLD.index);
               style.setLeftBorderColor(HSSFColor.PLUM.index);  

                //3.单元格应用样式
                cell.setCellStyle(style);
                //行:合并第一行,第二行,第三行
                //列说明:列也是从0开始的,0代表第一列;
                //列:合并第五列,第六列,第七列,第八列,第九列
                HSSFRow rowOther = sheet.createRow(0);
                HSSFCell cellOther = rowOther.createCell(4);
                cellOther.setCellValue("多行多列合并");
                sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));
                //一下代码表示在D4 cell 插入一段字符串
                HSSFRow row2 = sheet.createRow(3);
                HSSFCell cell2 = row2.createCell(3);
                cell2.setCellValue("只是一个数据而已");  

                 // Write the output to a file
                 FileOutputStream fileOut = new FileOutputStream("/Mouse/poi/test.xls");
                 wb.write(fileOut);
                 fileOut.close();
             }
    }

做下简单的说明,其实自己测试也能发现,那么就是对于合并单元格设置数据的问题。

 HSSFRow rowOther = sheet.createRow(0);
 HSSFCell cellOther = rowOther.createCell(4);
 cellOther.setCellValue("多行多列合并");
 sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));

比如这个创建第1行(0代表第1行),第5(4代表第5列)列,下面合并了第一到第三行,第5列到第19列,那么我设置值的时候只能设置坐标为(0,4)的,如果你改为如下:

HSSFRow rowOther = sheet.createRow(1);
HSSFCell cellOther = rowOther.createCell(4);
cellOther.setCellValue("多行多列合并");
sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));

此时的赋值是第2行,第五列,其实也是在合并的单元格内,但是最后生存的表格确是没数据的。

我做的表头是动态生成的,行也是动态的,最后导出的example如下图

三:总结

  其实解决一个问题,只要找到了门路,然后,自己冷静的去尝试,去找文档,很多问题都不是自己想象的那么困难。好久没写博客了,其实有些,只是一直放在草稿箱的,最近应该会坚持写完发出来了。努力,这一年努力,多看书,计划照常进行。GO。

时间: 2024-12-08 23:38:26

poi复杂excel的实现的相关文章

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

Poi解析Excel

Poi解析Excel Poi包里有4个主要的类,包括: Workbook------工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取, Sheet------------表格,Workbook实例的getSheetAt(int num)方法获取, Row--------------行,Sheet实例的getRow(int num)方法获取, Cell--------------单元格,Row实例的getCell(int num)方法获取,

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </depen

JAVA的POI操作Excel

1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 1.2 POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Exce

POI操作EXCEL(二)

原文转自:http://www.tqcto.com/article/code/295025.html java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境.然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位.或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼.还好 在POI HSSF中考虑到这个问题,可以设置encoding为双字节. POI可以到www.apache.org

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

java通过POI技术操作Excel(2)----模板读取,录入数据

先来回顾下通常把java对Excel的操作分为以下功能:1.生成模板,导出模板:2.填充模板,录入数据:3:读取数据库数据,导出数据:在上一篇博文中,我简单记录了模板生成和导出,在这篇博文中,主要来记录--Excel文件导入,数据录入(仍然是以jsp+servlet为例) 既然要解决这个问题,那首先来分析下我们需要面对的有哪些需求需要实现: 1.Excel文件导入(这是最基础的,巧妇难为无米之炊,导入环节也是查了好久才完成的); 2.Excel文件中数据的格式判定,你要读取文件,如果文件中其实没