主要解决使用POI写excel,并且添加数据校验,以及省市区级联菜单设置,分Excel2003与Excel2007两个版本。
关于POI与Excel之间的一些关系,以及设计方面的一些思想说明:
Java是一个面向对象的语言,在Java中用对象表达所有的事物,用对象来描述事物之间的关系。一个Excel文件其实可以分解成很多的对象,例如整个Excel就是一个大对象,然后分解之后可以看作是一个个SHEET对象组合起来的,接着SHEET对象又是由行对象ROW组合起来的,行对象又是由CELL对象组合起来的,等等。
如果你想设置字体或者样式,那么有字体Font对象,将字体应用到单元格上,那么那个单元格就会使用什么字体了, 还有样式例如单元格边框,或者说前景色等就是样式对象Style控制的。
如果你想加一点校验,这又该怎么解决呢?excel那么多单元格总不能全部添加同一种规则吧,所以需要一个表示范围的对象。即规则应用范围对象:CellRangeAddressList。范围有了,但是规则呢?所以还需要一个规则对象:DataValidationConstraint。我们将范围与规则组合在一起,应用到某个Sheet页上就完成了某一个Sheet页,指定单元格的数据校验了。
下面给了一个简答的示例图,可以帮助理解,该图对应是的2003版本的excel:
1、关于如何使用POI写2007的Excel
以下主要介绍关于如何设置字体样式,单个单元格的数据校验,以及省市区级联菜单的设置。
1.1、Excel2007字体样式的设置
@Test
// 关于2007版本的样式设置
public void testSetStyle2007() {
// 创建一个excel
Workbook book = new XSSFWorkbook();
// 在创建的excel上新建一个工作表,创建行,创建一个单元格,并设置单元格的值
Sheet sheet = book.createSheet("第一张工作表");
// 设置列宽,第一个参数代表列id(从0开始),第2个参数代表宽度值 参考 :"2012-08-10"的宽度为2500
sheet.setColumnWidth(1, 7000);
Row row = sheet.createRow(0);
// 获取样式
CellStyle style = book.createCellStyle();
// 一、设置背景色:
style.setFillForegroundColor((short)13);// 设置背景色
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 二、设置边框:
style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
// 三、设置居中:
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
// 设置字体 1
Font font = book.createFont();
font.setFontName("微软雅黑");
font.setFontHeightInPoints((short)10);// 设置字体大小
style.setFont(font);// 选择需要用到的字体格式
// 设置字体 2
Font font2 = book.createFont();
font2.setFontName("微软雅黑");
font2.setColor(Font.COLOR_RED);
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
font2.setFontHeightInPoints((short)12);
// 如果单元格只有部分字体需要格式
Cell cell = row.createCell(0);
RichTextString text = new XSSFRichTextString("*社区名称");
text.applyFont(0, 1, font2); // 0, 1 表示应用字体的范围
cell.setCellValue(text); // 设置单元格的值
// 将style应用到整个单元格
cell = row.createCell(1);
cell.setCellStyle(style);
cell.setCellValue("管理面积(平方米)");
FileOutputStream os = null;
try {
os = new FileOutputStream("D:/testSetStyle2007.xlsx");
book.write(os);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(os);
}
}
上面给出了关于2007版本中字体样式的的设置,如果仅仅只是想一部分应用样式,则可以使用RichTextString类。具体效果如下图:
1.2、Excel2007单元格数据校验
单元格的数据校验分为两种,第一种为下拉式的给定范围,输入只能是范围中的选项。另外一种为数据校验,例如时间只能是某个范围内的,或者说数据只能是整数小数等。
@Test
// 单个单元格校验
public void testConstraintExcel2007() {
Workbook book = new XSSFWorkbook();
Sheet sheet = book.createSheet("第一张工作表");
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet)sheet);
// 这里校验值准入输入0-100之间整数
// 规则
DataValidationConstraint dvConstraint = dvHelper.createIntegerConstraint(OperatorType.BETWEEN, "0", "100");
// 范围
CellRangeAddressList rangeAddressList = new CellRangeAddressList(0,