精华内容
下载资源
问答
  • Excel导出合并单元格导致数据丢失

    千次阅读 2019-12-22 16:17:52
    Excel导出合并单元格,导致数据丢失

    Excel导出合并单元格导致数据丢失

    场景:

    Excel导出,涉及到单元格的合并。 在处理完每一行的数据后,需要对同一个id的单元行进行合并,却发现,合并后出现数据丢失。 本该有31条数据,但是到处的excel加上合并的行,只有31行(excel的行标)。 一定是合并的时候出现了问题

    方案

    经过debug排查,发现是如下代码合并问题

    if(treeValueListSize > 1){
                    for(int n = 0; n < firstTitleNodeIndex;  n++){
                        CellRangeAddress region = new CellRangeAddress(dataRow, dataRow + treeValueListSize-1, n, n);
                        sheet.addMergedRegion(region);
                    }
                    for(int n = lastTitleNodeIndex + 1; n < title.length;  n++){
                        CellRangeAddress region = new CellRangeAddress(dataRow, dataRow + treeValueListSize-1, n, n);
                        sheet.addMergedRegion(region);
                    }
    
                    dataRow += treeValueListSize;
                }
    

    这里涉及到 sheet.addMergedRegion(region) 这个方法,方法如下

    sheet.addMergedRegion(new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
    

    代码从这里走过后, sheet里面的rows出现混乱。 初步猜测是这里的问题。

    那怎么办呢?

    猜想: 是在处理每一组数据的同时,进行excel行合并,导致出现问题。

    方案

    1. 重写合并方法,将所有excel行都先生成后,然后进行统一标记合并。 对每一组数据,记录要合并的 行号和列号。 修改。 成功!

    2. 仔细研究之前的代码,网上搜,边处理数据,边合并单元格。 也搜不到。 合并的单元格 为 region, 却在debug的里面找不到。。。。 放弃

    在这里插入图片描述

    展开全文
  • 定义导出excel复杂表头 @ExcelProperty 这是最常用的一个注解,注解中有三个参数value,index,converter分别代表列明,列序号,数据转换方式,注意value={“A”,“B”},如图“A”代表同一单元格上层,“B”下层 @...

    easyexcel-wraper
    easyexcel-wraper是什么?
    一个方便读取excel内容,且可以使用注解进行内容验证的包装工具

    用到alibaba 2.1.4版本

    定义导出excel复杂表头

    @ExcelProperty
    这是最常用的一个注解,注解中有三个参数value,index,converter分别代表列明,列序号,数据转换方式,注意value={“A”,“B”},如图“A”代表同一单元格上层,“B”下层在这里插入图片描述
    @ColumnWidth
    设置单元格的宽度

    package com.hhh.sup.project.model;
    
    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.annotation.write.style.ColumnWidth;
    import com.alibaba.excel.metadata.BaseRowModel;
    import lombok.Data;
    
    /**
     * @Description: 工程状态统计导出
     * @Author 3hcw
     * @Date 2021/2/3 15:01
     */
    @Data
    public class ProjectStatusExportBean extends BaseRowModel {
        //序号
        @ColumnWidth(10)
        @ExcelProperty(index = 0,value = {"序号"})
        private Integer xh;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 1,value = {"施工许可号"})
        private String builderLicense;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 2,value = {"报监编号"})
        private String zlProjectNum;
    
        @ColumnWidth(40)
        @ExcelProperty(index = 3,value = {"工程名称"})
        private String projectName;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 4,value = {"工程情况","建筑类别"})
        private String buildType;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 5,value = {"工程情况","具体类型"})
        private String buildChildType;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 6,value = {"工程情况","监督面积(㎡)"})
        private String allArea;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 7,value = {"工程情况","工程造价(万元)"})
        private String projectCost;
    
        @ColumnWidth(20)
        @ExcelProperty(index =8,value = {"工程情况","地上层次"})
        private String floorUp;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 9,value = {"工程情况","地下层次"})
        private String floorDown;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 10,value = {"工程情况","高度"})
        private String buildHeightStr;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 11,value = {"工程情况","工程报监日期"})
        private String reportDate;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 12,value = {"工程情况","实际开工日期"})
        private String beginDate;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 13,value = {"工程情况","建设单位"})
        private String jsUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 14,value = {"工程情况","施工单位"})
        private String sgUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 15,value = {"工程情况","监理单位"})
        private String jlUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 16,value = {"工程情况","设计单位"})
        private String sjUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 17,value = {"工程情况","勘察单位"})
        private String kcUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 18,value = {"工程情况","图审机构"})
        private String tsUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 19,value = {"工程情况","检测机构"})
        private String jcUnit;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 20,value = {"工程情况","工程地址"})
        private String address;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 21,value = {"形象进度","桩基"})
        private String zj;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 22,value = {"形象进度","深基坑"})
        private String sjk;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 23,value = {"形象进度","基础"})
        private String jc;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 24,value = {"形象进度","主体"})
        private String zt;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 25,value = {"形象进度","装饰"})
        private String zs;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 26,value = {"形象进度","节能"})
        private String jn;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 27,value = {"形象进度","幕墙"})
        private String mq;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 28,value = {"竣工验收日期"})
        private String endDate;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 29,value = {"监督小组成员"})
        private String monitorZl;
    
        @ColumnWidth(20)
        @ExcelProperty(index = 30,value = {"备注"})
        private String remark;
    }
    

    Controller层

        @PostMapping("/projectStatusExportExcel")
        public void projectStatusExportExcel(ManagerProjectBean bean, HttpServletResponse response, HttpSession session) {
            // 判断是否可以获取到用户
            UserInfoBean userInfoBean = (UserInfoBean) session.getAttribute("userInfoBean");
            if (FundStringUtil.isEmpty(userInfoBean) && FundStringUtil.isNotEmpty(bean.getUserId())) {
                userInfoBean = personService.findUserInfoBean(bean.getUserId());
            }
            if (FundStringUtil.isNotEmpty(userInfoBean.getCompanyType())) {
                if (VersionMonitorTypeEnum.SUP_VERSION_MONITOR_TYPE_02.getCode().equalsIgnoreCase(userInfoBean.getVersionType())) {
                    bean.setAqGovunitId(userInfoBean.getCompanyId());
                } else {
                    bean.setZlGovunitId(userInfoBean.getCompanyId());
                }
            }
            if (null != userInfoBean) {
                try {
                    List<ProjectStatusExportBean> list = managerProjectService.findManagerProjectStatusList(bean, userInfoBean);
                    String sheetName = "工程状态统计";
    //                ExportUtils.writeSingleExcel(sheetName,sheetName,list, ProjectStatusExportBean.class);
    
                    ExportUtils.writeSingleExcel(new MergeStrategy(list.size(),1),sheetName,sheetName,list, ProjectStatusExportBean.class);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    

    编写一个ExportUtils工具类

        public static <T> void writeSingleExcel(MergeStrategy mergeStrategy,String fileName,String sheetName, List<T> tList, Class tClass) throws IOException{
            HttpServletResponse response = RequestHolder.getResponse();
            try (ServletOutputStream outputStream = response.getOutputStream()){
                setResponse(fileName, response);
                EasyExcel.write(outputStream, tClass).autoCloseStream(Boolean.FALSE)
                        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                        .registerWriteHandler(new CustomCellWriteHandler())
                        .sheet(sheetName)
                        .registerWriteHandler(mergeStrategy)
                        .doWrite(tList);
            } catch (Exception e) {
                errorWrite(response, e);
            }
        }
        /**
         * 设置导出信息
         * @param fileName
         * @param response
         * @throws UnsupportedEncodingException
         */
        private static void setResponse(String fileName, HttpServletResponse response) throws UnsupportedEncodingException {
            // 重置response
            response.reset();
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码
            fileName = URLEncoder.encode(fileName + DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm_ss").format(LocalDateTime.now()) + ExcelTypeEnum.XLSX.getValue(), "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
    
        }
    

    自定义拦截器。对第一行第一列的头超链接到:https://blog.csdn.net/HXNLYW

    package com.hhh.framework.handler;
    
    import com.alibaba.excel.metadata.CellData;
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.handler.CellWriteHandler;
    import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
    import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
    import org.apache.poi.common.usermodel.HyperlinkType;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CreationHelper;
    import org.apache.poi.ss.usermodel.Hyperlink;
    import org.apache.poi.ss.usermodel.Row;
    
    import java.util.List;
    
    /**
     * 自定义拦截器。对第一行第一列的头超链接到:https://blog.csdn.net/HXNLYW
     *
     * @author subway
     */
    public class CustomCellWriteHandler implements CellWriteHandler {
    
        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                     Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                    Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                     List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
            if (isHead && cell.getColumnIndex() == 0) {
                CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
                Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL);
                hyperlink.setAddress("https://blog.csdn.net/HXNLYW");
                cell.setHyperlink(hyperlink);
            }
        }
    
    }
    

    自定义的合并策略,参考官方文档的LoopMergeStrategy

    package com.hhh.framework.util;
    
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.merge.AbstractMergeStrategy;
    import org.apache.commons.collections.map.HashedMap;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * @Description: 自定义的合并策略,参考官方文档的LoopMergeStrategy
     * @Author 3hcw
     * @Date 2021-03-08 18:37:37
     */
    public class MergeStrategy extends AbstractMergeStrategy {
        // 合并的列编号,从0开始,指定的index或自己按字段顺序数
        private Set<Integer> mergeCellIndex = new HashSet<>();
    
        // 数据集大小,用于区别结束行位置
        private Integer maxRow = 0;
    
        // 禁止无参声明
        private MergeStrategy() {
        }
    	//mergeCellIndex哪列数据需要合并
        public MergeStrategy(Integer maxRow, int... mergeCellIndex) {
            Arrays.stream(mergeCellIndex).forEach(item -> {
                this.mergeCellIndex.add(item);
            });
            this.maxRow = maxRow;
        }
    
        // 记录上一次合并的信息
        private Map<Integer, MergeRange> lastRow = new HashedMap();
    
        // 每行每列都会进入,绝对不要在这写循环
        @Override
        protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
            int currentCellIndex = cell.getColumnIndex();
            // 判断该行是否需要合并
            if (mergeCellIndex.contains(currentCellIndex)) {
                String currentCellValue = cell.getStringCellValue();
                int currentRowIndex = cell.getRowIndex();
                if (!lastRow.containsKey(currentCellIndex)) {
                    // 记录首行起始位置
                    lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));
                    return;
                }
                //有上行这列的值了,拿来对比.
                MergeRange mergeRange = lastRow.get(currentCellIndex);
                if (!(mergeRange.lastValue != null && mergeRange.lastValue.equals(currentCellValue))) {
                    // 结束的位置触发下合并.
                    // 同行同列不能合并,会抛异常
                    if (mergeRange.startRow != mergeRange.endRow || mergeRange.startCell != mergeRange.endCell) {
                        sheet.addMergedRegionUnsafe(new CellRangeAddress(mergeRange.startRow, mergeRange.endRow, mergeRange.startCell, mergeRange.endCell));
                    }
                    // 更新当前列起始位置
                    lastRow.put(currentCellIndex, new MergeRange(currentCellValue, currentRowIndex, currentRowIndex, currentCellIndex, currentCellIndex));
                }
                // 合并行 + 1
                mergeRange.endRow += 1;
                // 结束的位置触发下最后一次没完成的合并
                if (relativeRowIndex.equals(maxRow - 1)) {
                    MergeRange lastMergeRange = lastRow.get(currentCellIndex);
                    // 同行同列不能合并,会抛异常
                    if (lastMergeRange.startRow != lastMergeRange.endRow || lastMergeRange.startCell != lastMergeRange.endCell) {
                        sheet.addMergedRegionUnsafe(new CellRangeAddress(lastMergeRange.startRow, lastMergeRange.endRow, lastMergeRange.startCell, lastMergeRange.endCell));
                    }
                }
            }
        }
    }
    class MergeRange {
        public int startRow;
        public int endRow;
        public int startCell;
        public int endCell;
        public String lastValue;
    
        public MergeRange(String lastValue, int startRow, int endRow, int startCell, int endCell) {
            this.startRow = startRow;
            this.endRow = endRow;
            this.startCell = startCell;
            this.endCell = endCell;
            this.lastValue = lastValue;
        }
    }
    

    页面html

           //新增按钮
                $("#export").click(function () {
                    $("#exportProjectForm").attr("action", getRootPath() + "sup/projectRegisterRest/projectStatusExportExcel");
                    $("#exportProjectForm").submit();
                });
    

    最后导出效果
    在这里插入图片描述

    寄语

    技术来之不易,望各位码友多多分享

    展开全文
  • * 把从数据库读出的数据写成excel */ public class WriteExcelUtil { public int writeExcel(String filePath , List&lt;Map&lt;String, Object&gt;&gt; data) throws IOExc...

    自己写的一个工具类,传入拿到的数据,并且可以邻近相同数据的util

     

    /**
     * 把从数据库读出的数据写成excel
     */
    public class WriteExcelUtil {
    
        public int writeExcel(String  filePath , List<Map<String, Object>> data) throws IOException {
    
            //创建excel
            HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象
            HSSFSheet sheet = wb.createSheet("人员信息");//创建工作表并命名
            HSSFCellStyle cellStyle = wb.createCellStyle();//创建单元格样式
    
            //写入数据
            writeData(sheet,data);
    
            //合并单元格
            //行合并
            mergeCell(sheet);
            //列合并
            mergeRow(sheet);
    
    
            //以 文件名 + 精确到秒的时间.xls 的格式命名
            FileOutputStream out = new FileOutputStream(filePath+"sample"+ getTime() +".xls");
            wb.write(out);
            out.close();//关闭文件流
            return 1;
        }
    
        /**
         *
         * @return
         */
        public String getTime(){
            Date now = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            String time = dateFormat.format( now );
            return time;
        }
    
        /**
         * 数据写入sheet
         * @param sheet
         * @param data
         * @return
         */
        public int writeData(HSSFSheet sheet,List<Map<String, Object>> data){
            for (int i=0;i<data.size();i++) {
                HSSFRow row = sheet.createRow(i);
                //int num = 0;
                int len = data.get(i).size();
                for (int j=1;j <= 27;j++) {
                    ;
                    row.createCell(j-1).setCellValue(data.get(i).get("COL"+j).toString()); //设置Excel工作表的值
                } 
            }
            return 1;
        }
    
        /**
         * 比较列中相同单元格并合并
         * @param sheet
         * @return
         */
        public int mergeRow(HSSFSheet sheet){
            int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
            int cellNum = sheet.getRow(0).getLastCellNum();   //总共的列数量 注意:此处有n行获取到n
    
            int strat=-1,end=-1,flag=-1;
            String cellValue1="",cellValue2="";
            for(int i=0;i < cellNum ;i++) {
                for (int j = 0; j < rowNum - 1; j++) {
                    cellValue1 = sheet.getRow(j).getCell(i).getStringCellValue();
                    cellValue2 = sheet.getRow(j + 1).getCell(i).getStringCellValue();
                    //相等则记录相等起始位置
                    if( cellValue1.trim().equals(cellValue2.trim())  ){
                        if(strat == -1 ){
                            strat=j; //
                            end=j+1;
                            flag=i;
                        }else{
                            end++;
                        }
                    }else{
                        if(strat !=-1 ){
                            sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
                            strat=-1;
                            end=-1;
                            flag=-1;
                        }
                    }
                    //判断此列是否结束 且 是否需要合并单元格
                    if(strat !=-1 &&  j == rowNum - 2 ){
                        sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
                        strat=-1;
                        end=-1;
                        flag=-1;
                    }
                }
            }
    
            if(strat !=-1 ){
                sheet.addMergedRegion(new CellRangeAddress(strat, end,flag,flag));
                strat=-1;
                end=-1;
                flag=-1;
            }
    
            return 1;
        }
    
        /**
         * 合并单元格行
         * @param sheet
         * @return
         */
        public int mergeCell(HSSFSheet sheet){
            int rowNum = sheet.getLastRowNum()+1;//注意:此处有n行获取到n-1
            int cellNum = sheet.getRow(0).getLastCellNum();   //总共的列数量 注意:此处有n行获取到n
    
            int strat=-1,end=-1,flag=-1;
            String cellValue1="",cellValue2="";
            for(int i=0;i < rowNum ;i++){
                for(int j=0;j < cellNum - 1;j++){
                    cellValue1=sheet.getRow(i).getCell(j).getStringCellValue();
                    cellValue2=sheet.getRow(i).getCell(j+1).getStringCellValue();
                    if( cellValue1.trim().equals(cellValue2.trim())  ){
                        if(strat == -1 ){
                            strat=j;
                            end=j+1;
                            flag=i;
                        }else{
                            end++;
                        }
                    }else{
                        if(strat !=-1 ){
                            sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
                            strat=-1;
                            end=-1;
                            flag=-1;
                        }
                    }
    
                    //判断此列是否结束 且 是否需要合并单元格
                    if(strat !=-1 &&  j == rowNum - 2 ){
                        sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
                        strat=-1;
                        end=-1;
                        flag=-1;
                    }
                }
            }
    
            if(strat !=-1 ){
                sheet.addMergedRegion(new CellRangeAddress(flag,flag,strat, end));
                strat=-1;
                end=-1;
                flag=-1;
            }
    
            return 1;
        }
    }

    下面展示一组设计好的数据合并成的表头

     

    展开全文
  • 一、最近做一个导出excel需求,按理说很简单,但是发现写公共方法的哥们儿并没有搞合并单元格,而且也不太熟悉他的那种写法,所以简单研究了下,和大家讨论,至少思路千万条,越想越明了。 1、之前的写法简单看下,...

    一、最近做一个导出excel需求,按理说很简单,但是发现写公共方法的哥们儿并没有搞合并单元格,而且也不太熟悉他的那种写法,所以简单研究了下,和大家讨论,至少思路千万条,越想越明了
    1、之前的写法简单看下,不晓得从哪个网上拷贝的,哈哈。大概思路是:定义三个数组(导出excel实体的字段名,表头名,每列宽度设置),通过反射获取这些参数。
    在这里插入图片描述
    2、接下来具体看封装的ExeclUtils工具类,反射就不在这赘述了,重点说HSSFCellStyle样式的设置,其中有2个居中(垂直居中和水平居中)。

    // 设置水平垂直居中方式
    HSSFCellStyle style = workbook.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    ...
    // 中间省略
    // 单元格创建、设置内容和样式(真正生效一定是样式被设置到单元格上)
    HSSFCell cell = row1.createCell(j);
    cell.setCellValue(value[j]);
    cell.setCellStyle(style );
    // 按理说这2个设置后,合并单元格就可以居中了,但是却遗漏了一个点,就是单元格合并是动态的,需要明确单元格合并数,不然会出现,单元格是合并了,但是单元格是上水平居中。
    

    3、合并单元格居中,单元格如果是动态的,那么你就要明确给CellRangeAddress几行几列合并多少个。

    // 合并单元格,四个参数分别是行号的起止、列号的起止,比如下面这个,列号相同,都是变量k,说明只是单元格合并行号
    CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k);
    sheet.addMergedRegion(range);
    

    4、毕竟是公共类,为了不影响已有功能,简单开了一个分支出来写需要合并单元格的需求,方法不要太多,但是如果是我封装,我还是会定义一个注解,然后反射高度处理更多关于excel导入导出所需要求。

    /**
    *  一个定制化合并单元格代码简单示例。1、需求只合并行号。2、什么情况相邻行能合并
    */
    @SuppressWarnings({ "deprecation", "unchecked" })
    private static <T> void contractExcel(List<T> data, HSSFSheet sheet1, HSSFRow row1, String[] method,
    		HSSFCellStyle ALIGN_CENTER) throws NoSuchMethodException, SecurityException, IllegalAccessException,
    		IllegalArgumentException, InvocationTargetException {
    	List<T> list = (List<T>) data;
    
    	for (int i = 1; i < list.size(); i++) {
    		// 此处发现不同的业务合并单元格要求不一样,此处强转成不同的类,按时处理什么情况能合并单元格。
    		// 上一个单元格合同号(get(0)是第一个)
    		String oldContractId = list.get(i - 1).getContractId();
    		int size = 0;
    		String newContractId = "";
    		if(i != list.size()) {
    			// 当前单元格合同号
    			 newContractId = list.get(i).getContractId();
    			 size = list.stream().filter(m -> m.getContractId().equals(oldContractId)).collect(Collectors.toList())
    					.size();
    		}
    		int temp = size;
    		row1 = sheet1.createRow(i);
    		// 集合取0开始(本来就知道是某个对象了,不应该这么搞,拷贝方便,暂时不管)
    		T t = data.get(i - 1);
    		Class<?> clas = t.getClass();
    		a: for (int j = 0; j < method.length; j++) {
    			Method m = clas.getMethod(method[j]);
    			Object value = m.invoke(t);
    			HSSFCell cell = row1.createCell(j);
    			cell.setCellStyle(ALIGN_CENTER);
    			if (value == null) {
    				cell.setCellValue("");
    			} else if (value instanceof String) {
    				cell.setCellValue((String) value);
    			} else if (value instanceof Long) {
    				cell.setCellValue((Long) value);
    			} else if (value instanceof BigDecimal) {
    				cell.setCellValue(((BigDecimal) value).doubleValue());
    			} else if (value instanceof Integer) {
    				cell.setCellValue((Integer) value);
    			} else if (value instanceof LocalDateTime) {
    				cell.setCellValue(
    						((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    			} else {
    				throw new BussnisException(StateCommonCode.COMMON_SYSTEM_ERROR, "系统错误,没有相应实体的数据类型,请添加");
    			}
    			if (i > 1) {
    				if (!oldContractId.equals(newContractId) && temp > 1) {
    					for (int l = size; l > 0;) {
    						if (size == 1) {
    							for (int k = 0; k < 21; k++) {
    								cell.setCellStyle(ALIGN_CENTER);
    								// 合并单元格,只是行合并
    								CellRangeAddress range = new CellRangeAddress(i - temp + 1, i, k, k);
    								sheet1.addMergedRegion(range);
    							}
    						} else {
    							size--;
    						}
    						continue a;
    					}
    				}
    			}
    		}
    	}
    }
    
    展开全文
  • 代码:sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)参数:起始行号,终止行号, 起始列号,...
  • /***导出Excel表格**@paramallList要导出的数据*@paramheadArrjson键值对*@paramtitleArrexcel标题*@paramtitleExcel名字*@parammergeColumn要合并的列*/publicvoidexportExcel(JSONArrayallList,String[]headA...
  • php根据excel模板导出excel合并单元格,根据模板导出会少写很多样式的代码,非常方便
  • // 指定单元格垂直居中对齐 cellStyle.setWrapText(true); cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle....
  • excel poi工具类 导入 导出 合并单元格 计算公式
  • Springboot导出excel合并单元格示例

    千次阅读 2019-01-21 13:26:34
    原文链接:Springboot导出excel合并单元格示例 更多文章,欢迎访问:Java知音,一个专注于技术分享的网站 以下用一个示例来说明springboot如何导出数据到excel。 首先引入Maven依赖: &lt;dependency&gt; ...
  • //合并单元格 if(poiModel.getRowIndex() != i + dataSatrtIndex - 1) { sheet1.addMergedRegion(new CellRangeAddress(poiModel.getRowIndex(), i + dataSatrtIndex - 1, poiModel.getCellIndex(), poiModel....
  • //创建poi导出数据对象 SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); //创建sheet页 SXSSFSheet sheet = sxssfWorkbook.createSheet("开复工项目"); CellRangeAddress region1 = new CellRangeAddress(0, 1...
  • Java知音网站链接:www.javazhiyin.com/27467.html以下用一个示例来说明springboot如何导出数据到excel。首先引入Maven依赖: org.apache.poi poi 3.17 org.apache.poi poi-ooxml 3.17 org.apache.poi poi-oox...
  • 1、问题背景利用POI导出Excel表格,在导出的过程中涉及到双表头,即需要合并单元格2、实现源码/**** @Project:Report* @Title:MergeCell.java* @Package:com.you.excel* @Description:* @Author:YouHaiDong* @Date:...
  • Java导出Excel合并单元格

    千次阅读 2019-02-07 13:56:11
    Java导出Excel合并单元格
  • } /**合并单元格的例子 //表头样式设置 HSSFRow row0 = sheet.createRow(0); createMyCells(0,19,row0,titleRowStyle); sheet.addMergedRegion(getMyRegion(0, 2, 0, 0)); addMyTitle(row0, 0, "跟进人名称"); ...
  • 合并单元格类 public ActionForward doExport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("doExport...&...
  • jxl是一个韩国人写的java操作excel的工具,在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的,并不依赖Windows...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,379
精华内容 551
关键字:

excel导出合并单元格