导出 exl 按照已存在的固定格式

本文介绍了一种使用Java和Excel进行数据报告自动化的方法。通过读取模板文件并根据指定的数据填充,实现批量生成带有汇总和小计的报表。具体包括如何复制模板行、设置单元格值及公式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//获取已经存在exl 的地址 根据存在的exl格式创建显示数据(其实显示成想要的格式就是复制 固定的格式然后填充数据,看到了什么位置会发生变化 重新复制一行填充数据)

HSSFWorkbook workbook=new HSSFWorkbook(request.getSession(true).getServletContext().getResourceAsStream("/template/distributerCollect.xls"));

private void getDistributeReport(HSSFWorkbook workbook,

        Map<String, Object> filterMap,List<DistributerReportDto> list){
        HSSFSheet sheet = workbook.getSheetAt(0);
        String beginDate = map.get("beginDate");
        String endDate = map.get("endDate");
        int rowNum = list.size();
        int index = 4;
        int c=5;
        //判断是否是相同的
        String isSameName="null";
        //记录小计位置
        List<Integer> subtotal=new ArrayList<Integer>();
        for(int i=0;i < list.size(); i++){
            DistributerReportDto distributerDto = list.get(i);
            if(!distributerDto.getSupinstno().equals(isSameName)&&!isSameName.equals("null")){
               //复制要写入数据的那一列
                ExcelUtils.copyRow(workbook, sheet, index+1, index);
                HSSFRow row = sheet.getRow(index);
                String[] excelTitle = {"A","B","C","D","E","F","G","H","I","J","K","L"};
                for(int a = 3;a<row.getPhysicalNumberOfCells();a++){
                    if(a == 10){
                        continue;
                    }
                    String titleChar = excelTitle[a];
                    HSSFCell cell = row.getCell(a);
                    if(a==3){
                        cell.setCellValue(isSameName);
                    }
                    if(a==4){
                        cell.setCellValue(beginDate);
                    }
                    if(a==5){
                        cell.setCellValue(endDate);
                    }
                    if(a>5){
                    String fromula = rowNum == 0 ? "0" : "SUM("+titleChar+""+c+":"+titleChar+""+(index)+")";
                    cell.setCellFormula(fromula);
                    }
                }
                subtotal.add(index+1);//记录小计位置(记录的写值的位置要+1)
                index++;
                c=index+1;//记录小计开始的位置
            }
            ExcelUtils.copyRow(workbook, sheet, 3, index);
            HSSFRow row = sheet.getRow(index);
            Object[] obj = this.objArray(distributerDto);
            ExcelUtils.setdefaultRow(row, obj);
            isSameName=distributerDto.getSupinstno();
            index++;
            //获得最后一个小计
            if(list.size()-1==i){
                HSSFRow lastRowSum = sheet.getRow(index);
                String[] excelTitle = {"A","B","C","D","E","F","G","H","I","J","K","L"};
                for(int a = 3;a<lastRowSum.getPhysicalNumberOfCells();a++){
                    if(a == 10){
                        continue;
                    }
                    String titleChar = excelTitle[a];
                    HSSFCell cell = lastRowSum.getCell(a);
                    if(a==3){
                        cell.setCellValue(isSameName);
                    }
                    if(a==4){
                        cell.setCellValue(beginDate);
                    }
                    if(a==5){
                        cell.setCellValue(endDate);
                    }
                    if(a>5){
                        String fromula = rowNum == 0 ? "0" : "SUM("+titleChar+""+c+":"+titleChar+""+(index)+")";
                        cell.setCellFormula(fromula);
                    }
                }
            }
        }
        //写入汇总行
        int lastRowNum = index+1;
        HSSFRow lastRow = sheet.getRow(lastRowNum);
        String[] excelTitle = {"A","B","C","D","E","F","G","H","I","J","K","L"};
        for(int i = 4;i<lastRow.getPhysicalNumberOfCells();i++){
            if(i == 10){
                continue;
            }
            String titleChar = excelTitle[i];
            HSSFCell cell = lastRow.getCell(i);
            if(i==4){
                cell.setCellValue(beginDate);
            }
            if(i==5){
                cell.setCellValue(endDate);
            }
            if(i>5){
            //SUM("+titleChar+"4:"+titleChar+""+(lastRowNum-2)+")
            String toalSum="SUM("+titleChar+""+(index)+":"+titleChar+""+(index)+")";
            for(int j=0;j<subtotal.size();j++){
                //所以小计的和为总计
                toalSum=toalSum+"+"+"SUM("+titleChar+""+subtotal.get(j)+":"+titleChar+""+(subtotal.get(j))+")";
            }
            String fromula = rowNum == 0 ? "0" : toalSum;
            cell.setCellFormula(fromula);
            }
        }
        sheet.shiftRows(4, lastRowNum, -1);
    }
要将Python中的数据导出到Excel文件中,可以使用第三方库如 pandas 或 xlsxwriter。 以下是使用 pandas 的示例代码: ```python import pandas as pd # 创建数据 data = {'姓名': ['小明', '小红', '小刚'], '年龄': [18, 20, 22], '性别': ['男', '女', '男']} # 将数据转为 DataFrame df = pd.DataFrame(data) # 导出到 Excel 文件 df.to_excel('output.xlsx', index=False) ``` 以上代码将创建一个包含姓名、年龄和性别的数据表格,然后将其导出到名为 output.xlsx 的 Excel 文件中。`index=False` 表示不包含行索引。 如果你想要更加灵活地控制导出的 Excel 文件格式,可以使用 xlsxwriter 库。以下是使用 xlsxwriter 的示例代码: ```python import xlsxwriter # 创建 Excel 文件和工作表 workbook = xlsxwriter.Workbook('output.xlsx') worksheet = workbook.add_worksheet() # 写入数据 data = {'姓名': ['小明', '小红', '小刚'], '年龄': [18, 20, 22], '性别': ['男', '女', '男']} # 写入表头 header_format = workbook.add_format({'bold': True}) for col_num, value in enumerate(data.keys()): worksheet.write(0, col_num, value, header_format) # 写入数据 for row_num, row_data in enumerate(zip(*data.values())): for col_num, value in enumerate(row_data): worksheet.write(row_num + 1, col_num, value) # 关闭 Excel 文件 workbook.close() ``` 以上代码将创建一个包含姓名、年龄和性别的数据表格,并将其导出到名为 output.xlsx 的 Excel 文件中。在这个示例中,我们使用了 xlsxwriter 库来手动控制表格格式,包括添加表头和设置粗体字体。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值