大家好,又见面了,我是你们的朋友全栈君。
《 outside allowable range 》
异常信息:
Invalid row number (65536) outside allowable range (0..65535)
今天突然接到客户通知,说使用项目中的导出功能导出的 Excel 文件,打开时看不到业务数据,要求立即处理一下。
期间你可能需要准备两个 Jar 包: Servlet jar 包 和 POI jar 包
我打开 Excel 看了一下,导致的错误信息如下图所示:
如上图信息所示可知,Excel 的 Sheet超出了允许的范围;这是关于 《Java POI 导出 Excel 文件 》时遇到异常情况。
解决办法:
将原来的 POI 导出 Excel 的工具类,修改并加入如下内容即可完美的解决了,完全替换原来的 Util 也可以,下面的片段代码也是我在原来代码的基础新加的:
Java POI 导出 Excel 的工具类
package com.etc.bus.carpark.utils;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.Region;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.etc.bus.carpark.utils.IntegerToChineseNumberUtils;
import com.etc.third.tlq.bean.StopInThePayment;
/**
* 数据导出为Excel工具类
* * * @ClassName : ExportExcelUtils *
* * @Description : TODO *
* * @Author : HuaZai *
* * @ContactInformation : 1461522031@qq.com/huazai6789@aliyun.com *
* * @Date : 2017年10月20日 上午10:01:22 *
*
* * @Version : V1.0.0 *
*
*/
@SuppressWarnings({ "serial", "deprecation" })
@Component
public class ExportExcelUtil
extends HttpServlet {
// 阿拉伯数字转中文数字
@Autowired
private IntegerToChineseNumberUtils toChineseNuber;
/**
*
*
* * @throws UnsupportedEncodingException * * @Title : exportPayment *
*
* @Description : TODO *
*
* @Author : HuaZai *
*
* @Date : 2017年10月23日 上午10:12:02 *
*/
@SuppressWarnings({ "static-access" })
public void exportPayment(HttpServletRequest request, HttpServletResponse response, List
dataSet,
String[] headers) throws UnsupportedEncodingException {
// 声明一个工作簿
HSSFWorkbook wb = new HSSFWorkbook();
// 设置下载时弹出框
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
String fileName = "临停缴费";
response.addHeader("Content-Disposition",
"attachment;filename=" + new String((fileName + ".xls").getBytes(), "iso-8859-1"));
// 获取需要设置 Excel 的 Sheet 总页数
int dataCount = dataSet.size();
int page = dataCount % 10000;
int pageNo;
if (page == 0) {
pageNo = dataCount / 10000;
} else {
pageNo = dataCount / 10000 + 1;
}
// 设置 Sheet 的页数,当数据 超过 10000 条时 将数据 设值到下一个 Sheet
for (int i = 1; i <= pageNo; i++) {
// 在 Excel 中声明一个 Sheet
HSSFSheet sheet = wb.createSheet();
HSSFRow row1 = sheet.createRow(0);
row1.setHeight((short) 800);
// 创建表头单元格
HSSFCell cell1 = row1.createCell(0);
cell1.setCellValue("临停缴费记录报表(" + toChineseNuber.ToCH(i) + ")");
// 设置字体
HSSFFont font = wb.createFont();
// 字体高度
font.setFontHeightInPoints((short) 20);
// 字体颜色
font.setColor(HSSFFont.COLOR_NORMAL);
// 字体类型
font.setFontName("仿宋");
// 字体宽度
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置单元格类型
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
// 水平居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 垂直居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setWrapText(true);
// 设置单元格样式
cell1.setCellStyle(cellStyle);
// 创建内容单元格
HSSFRow row = sheet.createRow(1);
// 设置行高
row.setHeight((short) 400);
// 设置没列的宽度
sheet.setColumnWidth(0, 3000);
sheet.setColumnWidth(1, 5000);
sheet.setColumnWidth(2, 4000);
sheet.setColumnWidth(3, 5000);
sheet.setColumnWidth(4, 6000);
sheet.setColumnWidth(5, 6000);
sheet.setColumnWidth(6, 6000);
sheet.setColumnWidth(7, 6000);
sheet.setColumnWidth(8, 6000);
sheet.setColumnWidth(9, 6000);
sheet.setColumnWidth(10, 6000);
sheet.setColumnWidth(11, 6000);
// 设置字体样式
HSSFFont fontlast = wb.createFont();
// 字体高度
fontlast.setFontHeightInPoints((short) 12);
// 字体颜色
fontlast.setColor(HSSFFont.COLOR_NORMAL);
// 字体类型
fontlast.setFontName("宋体");
HSSFCellStyle style = wb.createCellStyle();
style.setFont(fontlast);
// 水平居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 垂直居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setWrapText(true);
// 设值表头值
for (int k = 0; k < headers.length; k++) {
HSSFCell cell = row.createCell(k);
cell.setCellValue(headers[k]);
cell.setCellStyle(cellStyle);
}
// 准备数据集合
List
stopInThePayments = dataSet;
// 当每个 Sheet 写满 10000 条数据 时,新建并写入下一个 Sheet
for (int j = 10000 * i - 10000; j < 10000 * i && j < dataCount; j++) {
row = sheet.createRow(j - 10000 * i + 10002);
StopInThePayment stopInThePayment = stopInThePayments.get(j);
HSSFCell cell = row.createCell(0);
cell.setCellValue(j + 1);// 编号
cell.setCellStyle(style);
cell = row.createCell(1);
cell.setCellValue(stopInThePayment.getName());// 停车场名称
cell.setCellStyle(style);
cell = row.createCell(2);
cell.setCellValue(stopInThePayment.getOutcarno());// 车牌号
cell.setCellStyle(style);
cell = row.createCell(3);
cell.setCellValue(stopInThePayment.getTime());// 停车时长
cell.setCellStyle(style);
cell = row.createCell(4);
cell.setCellValue(stopInThePayment.getPaymoney());// 应收金额
cell.setCellStyle(style);
cell = row.createCell(5);
cell.setCellValue(stopInThePayment.getAgiomoney());// 优惠金额
cell.setCellStyle(style);
cell = row.createCell(6);
cell.setCellValue(stopInThePayment.getCharmoney());// 实收金额
cell.setCellStyle(style);
cell = row.createCell(7);
cell.setCellValue(stopInThePayment.getType());// 缴费方式
cell.setCellStyle(style);
cell = row.createCell(8);
cell.setCellValue(stopInThePayment.getFreestatus());// 缴费状态
cell.setCellStyle(style);
cell = row.createCell(9);
cell.setCellValue(stopInThePayment.getOutoperationtime());// 缴费时间
cell.setCellStyle(style);
cell = row.createCell(10);
cell.setCellValue(stopInThePayment.getOutmemo());// 备注
cell.setCellStyle(style);
}
// 设置 Sheet 的合并范围
Region region = new Region(0, (short) 0, 0, (short) (10));
sheet.addMergedRegion(region);
}
try {
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
链接到 《 阿拉伯数字转中文数字 》
好了,经过上面的内容修改后,关于 “ outside allowable range ” 超出 Excel 的 Sheet 允许范围的异常情况。
太累了,不写了,我先去码我的代码去了,如果期间还遇到其它问题,可以给我留言,一起探讨。
也希望大家多多关注CSND的IT社区。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/146033.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...