主要对象
- 工作本: HSSFWorkbook(.xls) / XSSFWorkbook(.xlsx)
- 工作表:HSSFSheet / XSSFSheet
- 行:Row
- 单元格:Cell
- 其他:CellRangeAddressList 选中区域,DataValidationConstraint 数据约束,DataValidation 数据验证,XSSFCellStyle 单元格样式
读取与创建 Excel
/**
* 创建
* 1. 如果是一个FileOutputStream,则会直接创建文件
* 2. 可以是 response.getOutputStream(),则直接返回浏览器进行下载
*/
OutputStream os = ...;
XSSFWorkbook wb = new XSSFWorkbook();
wb.write(os);
os.flush();
// 读取
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
// 获取工作表
XSSFSheet sheet = workbook.getSheetAt(index);
// 获取总行数
int rows = sheet.getLastRowNum();
单元格合并
// 创建工作表
XSSFSheet sheet = wb.createSheet("sheetName");
// 添加合并区域,第一行前三个格子
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
// 设置合并区域的值,cell为0、1、2都一样
sheet.createRow(0)
.createCell(0)
.setCellValue("cellValue");
单元格样式
//创建样式对象、字体对象
XSSFCellStyle style = wb.createCellStyle();
XSSFFont font = wb.createFont();
// 字体
font.setFontName("宋体");
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setColor(HSSFFont.COLOR_NORMAL);
font.setFontHeight((short) 12*20);
style.setFont(font);
// 填充色
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
// 内容布局
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 给单元格设置样式
Cell cell = ...;
cell.setCellStyle("style");
下拉框
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
// 下拉框可选的数据,作为约束
XSSFDataValidationConstraint dvConstraint =
(XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(new String[]{"a", "b", "c"});
// 设置为下拉框的范围
CellRangeAddressList addressList =
new CellRangeAddressList(0, 0, 0, 4);
// 创建 DataValidation 对象
XSSFDataValidation validation =
(XSSFDataValidation)dvHelper.createValidation(dvConstraint, addressList);
validation.setShowErrorBox(true);
// 作用于指定工作表
sheet.addValidationData(validation);
下拉框引用隐藏域
- 用于解决上种方法,数组超过255和字节就会报错的问题
- 公式不能漏掉 $
- 与上面的区别只是创建了一个公式约束
// 创建一个隐藏域,users是下拉列表数组
String hiddenSheet = "hiddenSheet";
XSSFSheet sheet_hidden = wb.createSheet(hiddenSheet);
wb.setSheetHidden(1, true);
for (int i = 0; i < users.length; i++)
sheet_hidden.createRow(i)
.createCell(0)
.setCellValue(users[i]);
// 然后用公式去引用,隐藏域中的 A1:A user.length 就是上面设置的格子
String formula = hiddenSheet + "!$A$1:$A$" + users.length;
XSSFDataValidationConstraint dvConstraint_agent =
(XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint(formula);
CellRangeAddressList addressList_agent =
new CellRangeAddressList(2, 11, 3, 3);
XSSFDataValidation validation_agent =
(XSSFDataValidation)dvHelper.createValidation(dvConstraint_agent, addressList_agent);
validation_agent.setShowErrorBox(true);
sheet.addValidationData(validation_agent);