一:前言

  最近帮一个朋友做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(
, //first row (0-based)
(short), //first column (0-based)
, //last row (0-based)
(short) //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。

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

  1. POI操作Excel

    POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...

  2. POI对Excel自定义日期格式的读取

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel private List<String[]> rosolveFile(InputStream is, String ...

  3. poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  4. JAVA的POI操作Excel

    1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...

  5. POI导出excel日期格式

    参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...

  6. 使用jxl,poi读取excel文件

    作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...

  7. POI读取Excel内容格式化

    在用POI读取Excel内容时,经常会遇到数据格式化的问题. 比如:数字12365会变为12365.0;字符串数字123也会变为123.0,甚至会被变为科学计数法.另外日期格式化也是一个头疼的问题.其 ...

  8. Java Struts2 POI创建Excel文件并实现文件下载

    Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...

  9. poi操作excel的基本用法

    这周公司要用excel作为数据存储格式做一个文具申请的功能,感觉以前本来很简单的功能变复杂了不少,但是还是记录一下一些excel的基本用法. 写在最前面:这里只介绍一些excel的基本存储方式(读,写 ...

  10. APACHE POI教程 --java应用程序用POI与Excel交互

    POI报表 --用POI与Excel交互 AURISOFT 第一章 POI简介 --Jakata Poi HSSF:纯java的Excel解决方案 在我们实际的开发中,表现层的解决方案虽然有多样,但是 ...

随机推荐

  1. flask验证登录学习过程(1)---实践flask_jwt

    flask_jwt应用代码: from flask import Flask from flask_jwt import JWT,jwt_required,current_identity from ...

  2. HDU 5195 DZY Loves Topological Sorting 拓扑排序

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5195 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

  3. Windows Forms编程实战学习:第一章 初识Windows Forms

    初识Windows Forms 1,用C#编程 using System.Windows.Forms;   [assembly: System.Reflection.AssemblyVersion(& ...

  4. openssl 加密算法 CA 介绍

    首先对于tftp服务的简要使用说明 (1)yum安装:tftp.tftp-server   (2)启动tftp CentOS 6 service xinetd restart chkconfig tf ...

  5. 【第四周】psp

    代码累计 300+575+475+353=1603 随笔字数 1700+3000+3785+4210=12695 知识点 QT框架 Myeclipse基础环境 代码复用,封装 Ps技术 在excel画 ...

  6. (转)设置Sysctl.conf用以提高Linux的性能(最完整的sysctl.conf优化方案)

    Sysctl是一个允许您改变正在运行中的Linux系统的接口.它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能.用sysctl可以读取设置超过五百 ...

  7. Period II FZU - 1901(拓展kmp)

    拓展kmp板题 emm...我比较懒 最后一个字母进了vector两个1  不想改了...就加了个去重... 哈哈 #include <iostream> #include <cst ...

  8. 使用SetupDI* API列举系统中的设备

    原文链接地址:https://blog.csdn.net/clteng/article/details/801012?utm_source=blogxgwz8 在Windows系统中提供一组有用的函数 ...

  9. 信息收集利器——Nmap

    环境:kali2.0 常用的Nmap命令总结: 1.扫描单个IP地址 nmap 192.168.56.1 2.扫描一个网络中IP地址范围 nmap 192.168.56.1-255 3.扫描目标主机的 ...

  10. [ZJOI2007]棋盘制作 【最大同色矩形】

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...