Java Excel生成-劳务费明细表
以下是对代码的优化建议:
- 提取常量
将列宽度、表头、表格尾部等常量提取出来,放到类级别的常量中,方便管理和修改。
- 提取样式
将单元格样式和字体样式提取出来,放到类级别的变量中,避免重复创建样式对象。
- 提取方法
将创建表头、创建数据行、计算合计值等逻辑提取出来,作为单独的方法,提高代码复用性和可读性。
- 使用Lambda表达式
使用Lambda表达式简化循环操作,如计算合计值时可以使用Stream API的reduce方法。
- 增加注释
增加必要的注释,方便后续维护和修改。
综上所述,重构后的代码如下:
public class ExcelUtils {
// 常量定义
private static final int[] COLUMN_WIDTHS = {25, 12, 20, 25, 15, 15, 20, 20, 12, 12, 12};
private static final String[] HEADER_NAMES = {'序号', '姓名', '身份证号码', '单位名称', '电话号码', '银行所在省市', '开户银行及支行', '银行卡号', '应发含税金额(税前)', '个税', '实发税后金额(税后)'};
// 单元格样式和字体样式
private static CellStyle dataCellStyle;
private static CellStyle headerCellStyle;
private static Font headerFont;
private static CellStyle footerCellStyle;
private static Font footerFont;
static {
// 创建单元格样式和字体样式
Workbook workbook = new XSSFWorkbook();
dataCellStyle = workbook.createCellStyle();
dataCellStyle.setWrapText(true);
dataCellStyle.setAlignment(HorizontalAlignment.CENTER);
dataCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerCellStyle = workbook.createCellStyle();
headerCellStyle.setWrapText(true);
headerCellStyle.setAlignment(HorizontalAlignment.CENTER);
headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
headerFont = workbook.createFont();
headerFont.setBold(true);
headerCellStyle.setFont(headerFont);
footerCellStyle = workbook.createCellStyle();
footerCellStyle.setAlignment(HorizontalAlignment.CENTER);
footerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
footerFont = workbook.createFont();
footerFont.setBold(true);
footerCellStyle.setFont(footerFont);
}
public static Workbook createWorkbook() {
// 创建一个Workbook对象
Workbook workbook = new XSSFWorkbook();
// 创建一个Sheet对象
Sheet sheet = workbook.createSheet('劳务费明细');
// 设置列宽度
for (int i = 0; i < COLUMN_WIDTHS.length; i++) {
sheet.setColumnWidth(i, COLUMN_WIDTHS[i] * 256);
}
// 创建表头
createHeader(sheet);
// 创建数据行
createDataRows(sheet);
// 创建表格尾部
createFooter(sheet);
return workbook;
}
private static void createHeader(Sheet sheet) {
// 创建表头行
Row headerRow = sheet.createRow(3);
headerRow.setHeightInPoints(40);
// 创建表头单元格并设置样式和值
for (int i = 0; i < HEADER_NAMES.length; i++) {
Cell headCell = headerRow.createCell(i);
headCell.setCellStyle(headerCellStyle);
headCell.setCellValue(HEADER_NAMES[i]);
}
}
private static void createDataRows(Sheet sheet) {
// 循环创建数据行
for (int i = 0; i < 15; i++) {
Row dataRow = sheet.createRow(4 + i);
dataRow.setHeightInPoints(30);
// 循环创建单元格并设置样式和值
for (int j = 0; j < HEADER_NAMES.length; j++) {
Cell dataCell = dataRow.createCell(j);
dataCell.setCellValue('数据' + i + '-' + j);
dataCell.setCellStyle(dataCellStyle);
}
}
}
private static void createFooter(Sheet sheet) {
// 计算合计值
double sumAmount = IntStream.rangeClosed(1, 16).sum();
double sumTax = sumAmount * 2;
double sumNetAmount = sumAmount - sumTax;
// 创建表格尾部行
Row footerRow = sheet.createRow(19);
footerRow.setHeightInPoints(40);
// 创建表格尾部单元格并设置样式和值
Cell footerCell = footerRow.createCell(0);
footerCell.setCellStyle(footerCellStyle);
footerCell.setCellValue('合计');
footerCell = footerRow.createCell(8);
footerCell.setCellStyle(footerCellStyle);
footerCell.setCellValue(sumAmount);
footerCell = footerRow.createCell(9);
footerCell.setCellStyle(footerCellStyle);
footerCell.setCellValue(sumTax);
footerCell = footerRow.createCell(10);
footerCell.setCellStyle(footerCellStyle);
footerCell.setCellValue(sumNetAmount);
}
}
原文地址: http://www.cveoy.top/t/topic/lO3V 著作权归作者所有。请勿转载和采集!