以下是对代码的优化建议:

  1. 提取常量

将列宽度、表头、表格尾部等常量提取出来,放到类级别的常量中,方便管理和修改。

  1. 提取样式

将单元格样式和字体样式提取出来,放到类级别的变量中,避免重复创建样式对象。

  1. 提取方法

将创建表头、创建数据行、计算合计值等逻辑提取出来,作为单独的方法,提高代码复用性和可读性。

  1. 使用Lambda表达式

使用Lambda表达式简化循环操作,如计算合计值时可以使用Stream API的reduce方法。

  1. 增加注释

增加必要的注释,方便后续维护和修改。

综上所述,重构后的代码如下:

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);
    }
}
Java Excel生成-劳务费明细表

原文地址: http://www.cveoy.top/t/topic/lO3V 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录