使用PHP导出Excel时处理复杂表头的万能方法

使用PHP导出Excel时,如果是一级表头处理起来很简单,但如果碰到复杂一点的表头,比如二级、三级,甚至更多级别的表头要怎么办呢?

就像下面这个表头,有三层,并且每层都不太规则——

难道我们每次处理表头都要一列一列地拆分或者合并单元格吗?

当然不用,我们换个思路:

直接不处理表头,将一个含复杂表头的现成模板放到服务器,调用方法时下载模板文件,再把数据装进去,保存下来。

那就完全不用担心表头有多复杂的问题。

废话不多说,直接上现成代码!!!

 /**
     * 导出固定模板的excel文件(支持.xls、.xlsx格式)
     * (
     *  该方法主要用于导出复杂表头【如:2、3级表头等】的excel文件:
     *  1. 先将模板文件放到系统目录下;
     *  2. 调用方法时,将从系统目录下载模板文件,并将数据插入到excel模板对应的列数【不识别表头】当中
     *  3. 保存文件并返回文件名
     * )
     * @param $modelExcelPath   模板excel的文件路径(推荐使用系统相对路径,如:../runtime/obs/Excel模板.xls)
     * @param $fileName 文件名
     * @param $data 导出数据
     * @return string  $fileName  文件名
     */
    public static function exportExcel($modelExcelPath, $fileName = '', $data = '')
    {
        try{
            // 加载excel
            try {
                $inputFileType = \PHPExcel_IOFactory::identify($modelExcelPath);
                $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
                $objPHPExcel = $objReader->load($modelExcelPath);
            } catch(\Exception $e) {
                die('加载Excel发生错误:"'.pathinfo($modelExcelPath,PATHINFO_BASENAME).'": '.$e->getMessage());
            }

            // excel列数
            $cellName = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ'];

            // 处理数据
            $sheet = $objPHPExcel->getSheet(0); // 读取第一個工作表
            $maxRow = $sheet->getHighestRow(); // 取得总行数
            foreach($data as $val){
                $i = 0;    //列数
                $maxRow++;  // 循环操作行的行号
                foreach ($val as $key => $item){
                    $objPHPExcel->getActiveSheet()->setCellValue($cellName[$i] . $maxRow, $item);
                    $i++;
                }
            }

            // 文件类型
            $fileType = pathinfo($modelExcelPath, PATHINFO_EXTENSION);
            $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

            // 文件名
            if (empty($fileName)) {
                $fileName = "excel-" . date("YmdHis", time()) . rand(1000, 9999) . "." . $fileType;
            }else{
                $fileName = $fileName . date("YmdHis", time()) . rand(1000, 9999) . '.' . $fileType;
            }
            $file = \Env::get('runtime_path') . '/export/' . $fileName;

            // 保存文件并返回
            $objWriter->save($file);
            return $fileName;

        }catch(\Exception $exception) {
            throw new \Exception('出错了!');
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好!关于Java后端导出Excel并合并复杂表头的问题,可以使用Apache POI库来实现。 首先,需要创建一个Workbook对象,并使用它来创建Sheet对象。然后,可以使用CellRangeAddress类来定义要合并的单元格范围。最后,可以使用CellStyle类来设置单元格的样式,包括字体、边框、对齐方式等。 以下是一个示例代码,可以根据具体需求进行修改和扩展: ```java // 创建Workbook和Sheet对象 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 定义表头单元格范围 CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 3); CellRangeAddress region2 = new CellRangeAddress(0, 0, 4, 7); CellRangeAddress region3 = new CellRangeAddress(1, 2, 0, 0); CellRangeAddress region4 = new CellRangeAddress(1, 1, 1, 3); CellRangeAddress region5 = new CellRangeAddress(1, 1, 4, 7); // 合并单元格 sheet.addMergedRegion(region1); sheet.addMergedRegion(region2); sheet.addMergedRegion(region3); sheet.addMergedRegion(region4); sheet.addMergedRegion(region5); // 创建表头行和数据行 Row headerRow = sheet.createRow(0); Row dataRow = sheet.createRow(1); // 设置表头单元格样式 CellStyle headerStyle = workbook.createCellStyle(); Font headerFont = workbook.createFont(); headerFont.setBold(true); headerStyle.setFont(headerFont); headerStyle.setBorderBottom(BorderStyle.THIN); headerStyle.setBorderLeft(BorderStyle.THIN); headerStyle.setBorderRight(BorderStyle.THIN); headerStyle.setBorderTop(BorderStyle.THIN); headerStyle.setAlignment(HorizontalAlignment.CENTER); // 创建表头单元格并设置样式 Cell headerCell1 = headerRow.createCell(0); headerCell1.setCellValue("表头1"); headerCell1.setCellStyle(headerStyle); Cell headerCell2 = headerRow.createCell(4); headerCell2.setCellValue("表头2"); headerCell2.setCellStyle(headerStyle); Cell headerCell3 = headerRow.createCell(1); headerCell3.setCellValue("表头3"); headerCell3.setCellStyle(headerStyle); Cell headerCell4 = headerRow.createCell(4); headerCell4.setCellValue("表头4"); headerCell4.setCellStyle(headerStyle); // 设置数据单元格样式 CellStyle dataStyle = workbook.createCellStyle(); dataStyle.setBorderBottom(BorderStyle.THIN); dataStyle.setBorderLeft(BorderStyle.THIN); dataStyle.setBorderRight(BorderStyle.THIN); dataStyle.setBorderTop(BorderStyle.THIN); dataStyle.setAlignment(HorizontalAlignment.CENTER); // 创建数据单元格并设置样式 Cell dataCell1 = dataRow.createCell(0); dataCell1.setCellValue("数据1"); dataCell1.setCellStyle(dataStyle); Cell dataCell2 = dataRow.createCell(1); dataCell2.setCellValue("数据2"); dataCell2.setCellStyle(dataStyle); Cell dataCell3 = dataRow.createCell(2); dataCell3.setCellValue("数据3"); dataCell3.setCellStyle(dataStyle); Cell dataCell4 = dataRow.createCell(4); dataCell4.setCellValue("数据4"); dataCell4.setCellStyle(dataStyle); Cell dataCell5 = dataRow.createCell(5); dataCell5.setCellValue("数据5"); dataCell5.setCellStyle(dataStyle); Cell dataCell6 = dataRow.createCell(6); dataCell6.setCellValue("数据6"); dataCell6.setCellStyle(dataStyle); Cell dataCell7 = dataRow.createCell(7); dataCell7.setCellValue("数据7"); dataCell7.setCellStyle(dataStyle); // 输出Excel文件 FileOutputStream outputStream = new FileOutputStream("test.xlsx"); workbook.write(outputStream); workbook.close(); outputStream.close(); ``` 在上面的示例代码中,我们创建了一个包含复杂表头和数据的Excel文件,并输出到磁盘上。你可以根据自己的需求来修改代码,实现相应的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少糖加水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值