2 回答
TA贡献1828条经验 获得超3个赞
不要以那种复杂的方式绘制边框。
如果想这样做(使用单个CellStyle
s),则需要创建 8 个单个单元格样式。一种具有左上边缘的边框,一种具有上线的边框,一种具有右上边缘的边框,一种具有左线的边框,一种具有右线的边框,一种具有左下边缘的边框,一种具有边框底线和一个具有右下边缘的边框。然后,在创建单元格并用内容填充它们之后,必须将正确的单元格样式(之前创建的 8 个中的一个)应用于单元格。
这是丑陋和复杂的编码。所以人们经常做你所做的事情,只是为每个单元格创建一个新的单元格样式。但是Excel
在独特的单元格格式/单元格样式的数量上是有限的。请参阅Excel 规范和限制。因此,拥有包含大量数据的大工作表,很容易超过 64,000 种独特单元格格式/单元格样式的限制。因此,简单地为每个单元格创建一个新的单元格样式是错误的。
Busy Developers' Guide to HSSF and XSSF Features中的绘制边框展示了如何做得更好。
完整示例:
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.PropertyTemplate;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
class ExcelDrawingBorders {
public static void main(String[] args) throws Exception {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream fileout = new FileOutputStream("ExcelDrawingBorders.xlsx") ) {
int startDataRow = 4;
int endDataRow = 8;
int startDataColumn = 2;
int endDataColumn = 6;
Sheet sheet = workbook.createSheet();
for (int r = startDataRow; r <= endDataRow; r++) {
Row row = sheet.createRow(r);
for (int c = startDataColumn; c <= endDataColumn; c++) {
Cell cell = row.createCell(c);
cell.setCellFormula("RANDBETWEEN(10,50)");
}
}
PropertyTemplate propertyTemplate = new PropertyTemplate();
propertyTemplate.drawBorders(new CellRangeAddress(startDataRow-1, endDataRow+1, startDataColumn-1, endDataColumn+1),
BorderStyle.MEDIUM, BorderExtent.OUTSIDE);
propertyTemplate.applyBorders(sheet);
workbook.write(fileout);
}
}
}
结果:
在这里,PropertyTemplate和CellUtil为您完成了全部工作。PropertyTemplate
创建所需的属性s Map
。在应用于工作表时,它使用CellUtil
它在工作簿级别创建 8 种所需的单元格样式并将它们应用于正确的单元格。即使不存在但需要的单元格也会被创建。
TA贡献1786条经验 获得超13个赞
代码示例
PropertyTemplate ptT = new PropertyTemplate();
ptT.drawBorders(new CellRangeAddress(3, 3, 2, 6),
BorderStyle.THICK, BorderExtent.TOP);
ptT.applyBorders(sheet);
PropertyTemplate ptL = new PropertyTemplate();
ptL.drawBorders(new CellRangeAddress(3, 9, 2, 2),
BorderStyle.THICK, BorderExtent.LEFT);
ptL.applyBorders(sheet);
PropertyTemplate ptR = new PropertyTemplate();
ptR.drawBorders(new CellRangeAddress(3, 9, 6, 6),
BorderStyle.THICK, BorderExtent.RIGHT);
ptR.applyBorders(sheet);
PropertyTemplate ptB = new PropertyTemplate();
ptB.drawBorders(new CellRangeAddress(9, 9, 2, 6),
BorderStyle.THICK, BorderExtent.BOTTOM);
ptB.applyBorders(sheet);
添加回答
举报