1.xls一个sheet只能装65536行,多余则报错

poi包导出或写入excel超出65536报错: 
java.lang.IllegalArgumentException: Invalid row number (65536) outside allow

解决:每6w分一个sheet,关键代码红色部分

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
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.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; public class ExcelUtil {
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;
} 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;
}
}

poi excel超出65536行数限制自动扩展Invalid row number (65536) outside allow的更多相关文章

  1. C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535)

    C# Excel导出超出65536行报错 Invalid row number (65536) outside allowable range (0..65535) 一:报错 Invalid row ...

  2. 用VBA计算WPS 表格ET EXCEL中的行数和列数的多重方法

    用VBA计算WPS 表格ET EXCEL中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count Ac ...

  3. Excel的最大行数

    使用Excel2007或Excel2010,在“另存为” 菜单中可以选择为“Excel 07-2003 工作薄”,从中我们可以看出,到了2007版以后,存储格式变了,简单一点从扩展名便可以看出,一个是 ...

  4. Office EXCEL VBA如何取得EXCEL中的行数和列数

    VBA取得EXCEL表格中的行数和列数 请注意不要使用Columus等关键字作为变量,例如"Columus = ActiveSheet.UsedRange.Columns.Count&quo ...

  5. css文字超出指定行数显示省略号

    display: -webkit-box; overflow: hidden; word-break: break-all; /* break-all(允许在单词内换行.) */ text-overf ...

  6. CSS文本超出指定行数省略显示

    单行: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; 2行: font-size: 17px;overflow: hi ...

  7. Excel 2010 统计行数

    1. 首先选择一个空行 2.然后点击如下:公式 --- 3. 第一行:填写“103”,当然我也不能明白为啥填写103.照做就是了. 4.鼠标定位到 第二行 “Ref1”位置,然后 鼠标+shfit 按 ...

  8. css 超出规定行数自动隐藏

     单行overflow: hidden;text-overflow: ellipsis;white-space: nowrap;  多行(兼容各个浏览器)//通过覆盖最后几个字的形式p{positio ...

  9. excel运行最多行数

    2003及以前版本为65536(即6万多)行,256列2007版:1048576(即1百零多万)行,16384(即1千多)列

随机推荐

  1. DS图遍历--广度优先搜索

    题目描述 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则 ...

  2. ALGO-157_蓝桥杯_算法训练_阶乘末尾(高精度)

    问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 样例输出 数据规模和约定 n<=, ...

  3. Facet with Lucene

    Facets with Lucene Posted on August 1, 2014 by Pascal Dimassimo in Latest Articles During the develo ...

  4. WINDOWS和linux下stdcall

    __stdcall被这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈.这个关键字主要见于Micros ...

  5. python-selenium 并发执行用例的问题

    看了虫师的多进程执行测试用例一直都执行错误,最后解决了 解决方法如下: 使用threading模块 import threading 使用threading.Thread的方法 ,执行用例成功

  6. 学习笔记之Java

    Java (programming language) - Wikipedia https://en.wikipedia.org/wiki/Java_(programming_language) Ja ...

  7. 学习笔记之MobaXterm

    MobaXterm free Xserver and tabbed SSH client for Windows https://mobaxterm.mobatek.net/ Enhanced ter ...

  8. 廖雪峰Java5集合-4Set-1使用Set

    集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...

  9. windows10如何查看wifi密码

    1.首先,在你的电脑的右下角的WiFi的图标,右击它,选择"网络和internet设置"或者选择打开设置 :如下图 点击"更改适配器选项" 选择 WLAN选项, ...

  10. [UE4]widget事件:On Mouse Enter、On Move Leave、Set Color And Opactiy

    只要是widget对象,都具有On Mouse Enter.On Move Leave事件