POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。
因为xssf是将数据存在内存,所以为了防止内存溢出,就出现了sxssf,例:
SXSSFWorkbook w3= new SXSSFWorkbook(1000);
SXSSFWorkbook 设置内存中最多只有1000行数据,当超过这个数据时,就将内存之前的数据删除,并且会在硬盘中生成临时文件。从而保证了低内存消耗。
注:针对 SXSSF Beta 3.8下,会有临时文件产生
// 1、创建工作表
XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
XSSFSheet xssfSheet = xssfWorkbook.createSheet("sheet名称");
XSSFRow xssfRow; // 行
XSSFCell xssfCell; // 列
// 2、在sheet中创建行,注意判断 第一行是否已经创建,否则会覆盖之前的数据
xssfRow = xssfSheet.getRow(1);
if (xssfRow == null) {
xssfRow = xssfSheet.createRow(1);
}
// 3、创建单元格
xssfCell = xssfRow.createCell(1);
// 4、设置单元格内容
xssfCell.setCellValue("测试");
// 5、导出excel
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("表名.xlsx", "UTF-8"));
ServletOutputStream out = response.getOutputStream();
xssfWorkbook.write(out);
out.close();
xssfWorkbook.close();
把上面第2步到第4步替换成如下
(注:创建的单元格和值要取合并单元格左上角第一个)
// 创建合并单元格(int firstRow, int lastRow, int firstCol, int lastCol)
CellRangeAddress range = new CellRangeAddress(1, 1, 2, 5);
// 创建行
xssfRow = xssfSheet.getRow(range.getFirstRow());
if (xssfRow == null) {
xssfRow = xssfSheet.createRow(range.getFirstRow());
}
// 创建列
xssfCell = xssfRow.createCell(range.getFirstColumn());
// 设置单元格内容
xssfCell.setCellValue("测试");
// 添加合并单元格到sheet
xssfSheet.addMergedRegion(range);
// 设置单元格样式:
CellStyle style = xssfWorkbook.createCellStyle();
// 1、水平\垂直居中
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
// 2、设置背景色
style.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 全部填充
// 3、字段加粗
XSSFFont font = xssfWorkbook.createFont();
font.setBold(true);
style.setFont(font);
// 4、设置单元格样式为黑色实线(不是合并单元格,如果是合并单元格用下面第5个)
style.setBorderBottom(BorderStyle.THICK); //下边框
style.setBorderLeft(BorderStyle.THICK); //左边框
style.setBorderTop(BorderStyle.THICK); //上边框
style.setBorderRight(BorderStyle.THICK); //右边框
xssfCell.setCellStyle(style);
// 5、设置合并边框样式为黑色实线(放最后以免样式被覆盖)
RegionUtil.setBorderBottom(BorderStyle.THICK, range , xssfSheet);
RegionUtil.setBorderRight(BorderStyle.THICK, range , xssfSheet);
RegionUtil.setBorderTop(BorderStyle.THICK, range , xssfSheet);
RegionUtil.setBorderLeft(BorderStyle.THICK, range , xssfSheet);
单元格对应颜色:POI 设置Excel单元格背景色
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("导入模板");
// 1、设置表头
。。。。。
// 2、为第3列设置下拉选项
String[] arr = {"选项1","选项2"};
sheet.addValidationData(addValidationData(sheet, arr, 3));
// 如果下拉数据过长不展示,用下面这个方法
setLongHSSFValidation(workbook,arr,sheet,1,arr.length,3,1);
/**
* 设置下拉列表
*
* @param sheet 页
* @param datas 下拉数组
* @param index 下拉列序号
* @return
*/
private XSSFDataValidation addValidationData(XSSFSheet sheet, String[] datas, Integer index) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(datas);
CellRangeAddressList addressList = null;
XSSFDataValidation validation = null;
addressList = new CellRangeAddressList(1, 100000, index, index);// 开始结束行,index表示开始和结束列
validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, addressList);
// 这两行设置单元格只能是列表中的内容,否则报错
validation.setSuppressDropDownArrow(true);
validation.setShowErrorBox(true);
return validation;
}
/**
* 解决下拉框过长不显示问题
* @param workbook
* @param deptList 下拉数据数组
* @param sheet
* @param firstRow 开始行
* @param endRow 结束行
* @param cellNum 下拉框所在的列
* @param sheetIndex 隐藏sheet名称
*/
public static void setLongHSSFValidation(XSSFWorkbook workbook,String[] deptList ,XSSFSheet sheet ,int firstRow, int endRow, int cellNum,int sheetIndex) {
String hiddenName = "hidden"+cellNum;
//1.创建隐藏的sheet页。 起个名字吧!叫"hidden"!
XSSFSheet hidden = workbook.createSheet(hiddenName);
//2.循环赋值(为了防止下拉框的行数与隐藏域的行数相对应,将隐藏域加到结束行之后)
for (int i = 0, length = deptList.length; i < length; i++) {
hidden.createRow(endRow + i).createCell(cellNum).setCellValue(deptList[i]);
}
Name category1Name = workbook.createName();
category1Name.setNameName(hiddenName);
//3 A1:A代表隐藏域创建第N列createCell(N)时。以A1列开始A行数据获取下拉数组
category1Name.setRefersToFormula(hiddenName + "!A1:A" + (deptList.length + endRow));
//
DataValidationHelper helper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenName);
CellRangeAddressList addressList = new CellRangeAddressList(1, endRow, cellNum, cellNum);
DataValidation dataValidation = helper.createValidation(constraint, addressList);
if (dataValidation instanceof XSSFDataValidation) {
// 数据校验
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
} else {
dataValidation.setSuppressDropDownArrow(false);
}
// 作用在目标sheet上
sheet.addValidationData(dataValidation);
// 设置hiddenSheet隐藏
workbook.setSheetHidden(sheetIndex, true);
}