今天想要和记录一下poi的小心得,反正记是不可能记住的,永远不可能记住的。但是一篇文章想写完感觉也有点困难,篇幅太长
一、对表进行锁定保护,用在需要上传固定的表格,但是经常有野蛮之人修改原表格然后上传的情况
先有WorkBook,创建sheet并先创建行然后创建列,设置行和列样式,而锁定表格通过protectSheet("password")来设置保护,当需要放开某个表格的时候,就覆盖其默认样式并将样式的setLocked(false)属性设置为false。
//创建Excel表格
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("YourSheetName");
sheet.setDefaultRowHeightInPoints(25);
/**设置默认的宽度,需要指定某列的时候宽
* 使用sheet.setColumnWidth(0,12)
*
*/
sheet.setDefaultColumnWidth(20);
//整个表格锁定,开放只需要开放的单元格
sheet.protectSheet("password");
//创建你需要的行数,可以使用for循环来创建同一的行数 5行5列
HSSFRow firstRow = sheet.createRow(0);
for (int i = 0; i < 5 ; i++) {
HSSFRow row = sheet.createRow(i);
for (int j = 0; j < 5; j++) {
HSSFCell cell = row.createCell(j);
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setBorderRight(BorderStyle.THIN);
cell.setCellStyle(cellStyle);
cell.setCellValue(j);
}
}
//放开第5行第3列可编辑
HSSFRow rowForFour = sheet.getRow(4);
HSSFCell cellForThird = rowForFour.getCell(2);
HSSFFont font = workbook.createFont();
font.setFontName("微软雅黑");
font.setFontHeightInPoints((short) 12);
font.setColor(IndexedColors.BLACK.getIndex());
HSSFCellStyle unlockStyle = workbook.createCellStyle();
unlockStyle.setAlignment(HorizontalAlignment.CENTER);
unlockStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//自动换行
unlockStyle.setWrapText(true);
//设置字体
unlockStyle.setFont(font);
//设置单元格放开
unlockStyle.setLocked(false);
cellForThird.setCellStyle(unlockStyle);
//将创建的Excel表格输出 创建文件
File excelFile = new File("D:/Excel","yourFileName.xls");
//创建目录
excelFile.getParentFile().mkdirs();
try (FileOutputStream fileOutStream = new FileOutputStream(excelFile)) {
workbook.write(fileOutStream);
IOUtils.closeQuietly(fileOutStream);
}
而里面设置你需要放开的单元格,将其设置为false即可。 unlockStyle.setLocked(false);
对于已经保护的表,要修改里面的内容的话就需要先将其复制一份,在复制的时候对表进行解除保护。
二、对于表格的合并
对于单元格的合并,我的理解是合并的区域是单独的对象,需要在合并的地方填上值的话,就要创建合并区域对应的单元格来对其进行赋值.
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheetOne = workbook.createSheet("sheetOne");
//合并区域 合并第一,二行 第一列
sheetOne.addMergedRegion(new CellRangeAddress(0,1,0,0));
//创建第二个单元格,并且赋值
HSSFRow oneRow = sheetOne.createRow(0);
//HSSFCell oneCell = oneRow.createCell(0);
HSSFCell twocell = oneRow.createCell(1);
//oneCell.setCellValue("1:1被合并的单元格赋值");
twocell.setCellValue("1:2");
HSSFRow twoRow = sheetOne.createRow(1);
HSSFCell twoRowCell = twoRow.createCell(2);
twoRowCell.setCellValue("2:3");
//合并第5,6,7行第三行
HSSFRow fiveRow = sheetOne.createRow(4);
HSSFCell fiveRowCell = fiveRow.createCell(2);
HSSFCell t53Cell = fiveRow.createCell(2);
HSSFCell t51Cell = fiveRow.createCell(0);
t51Cell.setCellValue("第五行第一列");
fiveRowCell.setCellValue("合并第5,6,7行第3列");
sheetOne.addMergedRegion(new CellRangeAddress(4,6,2,2));
HSSFRow sixRow = sheetOne.createRow(5);
HSSFCell sixRowCell = sixRow.createCell(0);
sixRowCell.setCellValue("第六行第一列");
HSSFRow sevenRow= sheetOne.createRow(6);
HSSFCell sevenCell = sevenRow.createCell(0);
sevenCell.setCellValue("第七行第一列");
try {
FileOutputStream fo = new FileOutputStream("D:/test03.xls");
workbook.write(fo);
} catch (Exception e) {
e.printStackTrace();
}
设置为合并的单元格设置边框:
//给合并单元格设置边框值
int numberOfRows = singleSheet.getPhysicalNumberOfRows();
logger.info("合并单元格的");
int lastNum = singleSheet.getPhysicalNumberOfRows()
CellRangeAddress address = new CellRangeAddress(numberOfRows, lastNum, 1, 1);
singleSheet.addMergedRegion(quitDepNameAddress);
RegionUtil.setBorderLeft(BorderStyle.THIN,address,singleSheet);
RegionUtil.setBorderRight(BorderStyle.THIN,address,singleSheet);
RegionUtil.setBorderTop(BorderStyle.THIN,address,singleSheet);
RegionUtil.setBorderBottom(BorderStyle.THIN,address,singleSheet);
对于表格样式,要明白产生的先后顺序,不然的话,就容易被后面的样式覆盖。
三、隐藏表格线
对于隐藏表格线一种方式是通过对单元格设置它的style来指定
HSSFCellStyle style = workbook.createCellStyle();
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setStyle(style)
另一种需要整个表格去除表格线是通过对sheet对象设置其属性Gridlines.
sheet.setDisplayGridlines(false);
sheet.setPrintGridlines(false);
四、给你的表格添加批注
//(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)
//前四个参数是坐标点,后四个参数是编辑和显示批注时的大小
HSSFClientAnchor anchor = new HSSFClientAnchor(1, 2, 3, 4,
(short) 1, 1, (short) 3, 1);
HSSFComment comment = (HSSFComment) cell.getSheet().createDrawingPatriarch().createCellComment(anchor);
//设置批注内容
comment.setString(new HSSFRichTextString(commentValue));
//将批注添加到单元格对象中
cell.setCellComment(comment);
需要注意的是:
1.一张sheet表,只能创建一个绘画对象HSSFPatriarch,这里是通过单元格反着获取到sheet再创建的
如果一张表创建多个绘画对象HSSFPatriarch,在添加批注时,会出现错误,会导致只有最后一行添加了批注
2. HSSFWorkbook 这种创建的工作表,只能对第一张工作表操作
3.在输出过程中,不能添加一次输出一次,必须要等到对最后一行数据校验完毕后才能输出,否则会覆盖点之前的批注或者只能在第一个上添加批注
附上学习通道:https://www.cnblogs.com/XZHR/p/5634609.html
https://www.cnblogs.com/xdcr/p/6564963.html