poi excel 合并单元格
结论:final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip,
colId, colId + cellSkip); // 起始行, 终止行, 起始列, 终止列 // 终止行,
sheet.addMergedRegion(cra);
1.创建workbeet
public static HSSFWorkbook getHSSFWorkbook(String sheetName, JsonArray title,
String[][] values, HSSFWorkbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb == null) {
wb = new HSSFWorkbook();
} // -个sheet限制存65536条,此处仅存60000
System.out.println(values.length);
final int sheetNum = (int) Math.ceil((float) values.length / 60000);
for (int n = 1; n <= sheetNum; n++) { // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
final HSSFSheet sheet = wb.createSheet(sheetName + "_" + n);
System.out.println("sheetName" + sheetName + "_" + n);
sheet.setDefaultColumnWidth(12); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row; // 第四步,创建单元格,并设置值表头样式
final HSSFCellStyle headerStyle = wb.createCellStyle();
headerStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中
headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直居中
final Font fontStyle = wb.createFont(); // 字体样式
fontStyle.setBoldweight(Font.BOLDWEIGHT_BOLD); // 加粗
fontStyle.setFontName("黑体"); // 字体
fontStyle.setFontHeightInPoints((short) 11); // 大小
// 将字体样式添加到单元格样式中
headerStyle.setFont(fontStyle);
// 边框
headerStyle.setBorderBottom(CellStyle.BORDER_THIN);
headerStyle.setBorderLeft(CellStyle.BORDER_THIN);
headerStyle.setBorderRight(CellStyle.BORDER_THIN);
headerStyle.setBorderTop(CellStyle.BORDER_THIN); // 普通单元格样式,边框,水平居中
final HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中
cellStyle.setBorderBottom(CellStyle.BORDER_THIN);
cellStyle.setBorderLeft(CellStyle.BORDER_THIN);
cellStyle.setBorderRight(CellStyle.BORDER_THIN);
// cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
final HSSFDataFormat df = wb.createDataFormat(); // 此处设置数据格式
cellStyle.setDataFormat(df.getFormat("#,#0.0")); // 小数点后保留两位,可以写contentStyle.setDataFormat(df.getFormat("#,#0.00"));
// 声明列对象
HSSFCell cell = null; // 创建标题
JsonArray cellArray = new JsonArray();
JsonObject object = new JsonObject();
JsonObject temobj = new JsonObject();
int rowSkip = 0, cellSkip = 0; String tempCell = "";
for (int rowId = 0; rowId < title.size(); rowId++) {
row = sheet.createRow(rowId);
object = title.get(rowId).getAsJsonObject();
cellArray = object.get("row").getAsJsonArray(); // colId为excel列索引,cellId为行标题值的数组索引,cellId遇到当前单元格已使用时,填充至下一个可使用的单元格
for (int colId = 0, cellId = 0; cellId < cellArray.size(); colId++) {
cell = row.createCell(colId);
cell.setCellStyle(headerStyle); if (isMergedRegion(sheet, rowId, colId)) {
continue;
}
temobj = cellArray.get(cellId).getAsJsonObject();
tempCell = temobj.get("cellvalue").toString().replace("\"", "");
try {
// System.out.println(tempCell);
tempCell = new String(tempCell.getBytes("UTF-8"), "ISO-8859-1");
// System.out.println(tempCell);
tempCell = new String(tempCell.getBytes("ISO-8859-1"), "UTF-8");
// System.out.println(tempCell);
} catch (final Exception e) {
e.printStackTrace();
}
cell.setCellValue(tempCell);
// System.out.println(cell);
// System.out.println(cell.getStringCellValue());
cell.setCellStyle(headerStyle);
cellId++; // 合并单元格
rowSkip = temobj.get("rowspan").getAsInt();
cellSkip = temobj.get("colspan").getAsInt();
// System.out.println(rowSkip + "=skip==" + cellSkip);
if (rowSkip > 1 && rowSkip-- > 0 || cellSkip > 1 && cellSkip-- > 0) {// 用于起始行列计算时需减1
final CellRangeAddress cra = new CellRangeAddress(rowId, rowId + rowSkip,
colId, colId + cellSkip); // 起始行, 终止行, 起始列, 终止列 // 终止行,
sheet.addMergedRegion(cra);
}
}
}
// 创建内容 -个sheet只能存65536条
for (int i = 0; i < 60000 && i < values.length - (n - 1) * 60000; i++) {
row = sheet.createRow(title.size() + i);
for (int j = 0; j < values[i].length; j++) {
// 将内容按顺序赋给对应的列对象
cell = row.createCell(j);
cell.setCellValue(values[(n - 1) * 60000 + i][j]);
cell.setCellStyle(cellStyle); }
}
}
return wb;
}
2.isMergedRegion方法
public static boolean isMergedRegion(HSSFSheet sheet, int row, int column) {
final int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
final CellRangeAddress range = sheet.getMergedRegion(i);
final int firstColumn = range.getFirstColumn();
final int lastColumn = range.getLastColumn();
final int firstRow = range.getFirstRow();
final int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
}
3.title数据结构
"row":
[{"cellvalue":"","rowspan":0,"colspan":0},
{"cellvalue":"","rowspan":0,"colspan":0},
{"cellvalue":"us","rowspan":0,"colspan":"2"},
{"cellvalue":"uk","rowspan":0,"colspan":"2"},
{"cellvalue":"ch","rowspan":0,"colspan":"2"},
{"cellvalue":"ck","rowspan":0,"colspan":"2"},
{"cellvalue":"au","rowspan":0,"colspan":"2"},
{"cellvalue":"ja","rowspan":0,"colspan":"2"},
{"cellvalue":"cn","rowspan":0,"colspan":"2"},
{"cellvalue":"","rowspan":0,"colspan":0},
{"cellvalue":"","rowspan":0,"colspan":0}]
},{
"row":
[{"cellvalue":"group","rowspan":0,"colspan":0},
{"cellvalue":"name","rowspan":0,"colspan":0},
{"cellvalue":"合计汇总","rowspan":0,"colspan":0},
{"cellvalue":"Count","rowspan":0,"colspan":0},
{"cellvalue":"合计汇总","rowspan":0,"colspan":0},
{"cellvalue":"Count","rowspan":0,"colspan":0},
{"cellvalue":"合计汇总","rowspan":0,"colspan":0},
{"cellvalue":"Count","rowspan":0,"colspan":0},
{"cellvalue":"合计汇总","rowspan":0,"colspan":0},
{"cellvalue":"Count","rowspan":0,"colspan":0},
{"cellvalue":"合计汇总","rowspan":0,"colspan":0}]
}]
poi excel 合并单元格的更多相关文章
- poi读取合并单元格
poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...
- asp.net C#取Excel 合并单元格内容
asp教程.net c#取excel 合并单元格内容读取excel数据,填充dataset// 连接字符串 string xlspath = server.mappath("~/www.11 ...
- Java导出Excel表,POI 实现合并单元格以及列自适应宽度(转载)
POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...
- java poi导出Excel合并单元格并设置边框
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; i ...
- poi导出excel合并单元格(包括列合并、行合并)
1 工程所需jar包如下:commons-codec-1.5.jarcommons-logging-1.1.jarlog4j-1.2.13.jarjunit-3.8.1.jarpoi-3.9-2012 ...
- poi获取合并单元格内的第一行第一列的值
当读取如图所示的excel时,显示为第1行 第1列 的内容是:合并单元格 其它在合并单元格区域内的单元格不显示 示例代码如下: import java.io.FileInputStream; impo ...
- NPOI之Excel——合并单元格、设置样式、输入公式、设置筛选等
首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkboo ...
- 创建excel,合并单元格,设置单元格样式
package com.huawei.excel; import java.io.File;import java.io.FileOutputStream;import java.util.Date; ...
- POI 实现合并单元格以及列自适应宽度
POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...
随机推荐
- sysroot和prefix
--with-sysroot用来指定系统的root.该选项主要用于新系统(比如LFS)构建或交叉编译.比如你的LFS的root在/mnt/lfs,那么configure时指定--with-sysroo ...
- DS树+图综合练习--构建邻接表
题目描述 已知一有向图,构建该图对应的邻接表.邻接表包含数组和单链表两种数据结构,其中每个数组元素也是单链表的头结点,数组元素包含两个属性,属性一是顶点编号info,属性二是指针域next指向与它相连 ...
- 引用 自动化测试基础篇--Selenium简介
原文链接:http://www.cnblogs.com/sanzangTst/p/7452636.html 鸣谢参藏法师 一.软件开发的一般流程 二.什么叫软件测试? 软件测试(英语:Software ...
- VMware中四种网络连接模式的区别
安装好VMwareWorkstations之后,进行虚拟机网络配置时有四种网络连接方式,桥接.仅主机.NAT.LAN区段. 之所以有不同的模式,在我看来是为了满足不同的网络需求,总的来说:桥接.NAT ...
- vc++post方式登录网站
以http://www.idc3389.com为例: 效果图: 使用Fiddler工具进行抓包,截图: 可以发现: 1.并没有使用cookie并没有用作用户身份识别,因为登录前后的cookie并没有发 ...
- Flume的基本概念
Flume 概念 Flume 最早是Cludera提供的日志收集系统,后贡献给Apache.所以目前是Apache下的项目,Flume支持在日志系统中指定各类数据发送方,用于收集数据. Flume 是 ...
- [转][C#]TopSelf
新建一个批处理,用于启动 TopSelf 服务 @echo off Service.exe install net start Service 或者简化成 @echo off Service.exe ...
- Ajax中最有名axios插件(只应用于Ajax)(post方法,官网写错了,应是字符串格式)
/* axios v0.18.0 | (c) 2018 by Matt Zabriskie */!function(e,t){"object"==typeof exports&am ...
- [UE4]虚幻4 spline组件、spline mesh组件的用法
最近公司项目需要,把这两个东东好好看了下.不得不说,这两个组件还是非常方便的,但是相关的介绍.教程却非常的少.它们概念模糊,用法奇特,我就总结下吧. 首先,先要明白spline component.s ...
- AMQP & JMS对比(转载)
AMQP & JMS对比 原文地址:https://blog.csdn.net/hpttlook/article/details/23391967 初次接触消息队列时,在网上搜索,总是会提到如 ...