访问jxls官网:http://jxls.sourceforge.net/

官网中也有例子:https://bitbucket.org/leonate/jxls-demo/src/master/。

笔者会在最后一篇总结中将笔者的项目和Excel文件打包上传

合并行,官网给出的例子不同进行动态的合并,这里从网上找了一个

/**
 * <p>合并单元格</p>
 * jx:merge(
 *  lastCell="单元格"
 *  [, cols="合并的列数"]
 *  [, rows="合并的行数"]
 *  [, minCols="最小合并的列数"]
 *  [, minRows="最小合并的行数"]
 * )
 * @author Victor
 * @date 2018年12月6日
 */
public class MergeCommand extends AbstractCommand{
    private String cols;        //合并的列数
    private String rows;        //合并的行数
    private String minCols;     //最小合并的列数
    private String minRows;     //最小合并的行数
    private CellStyle cellStyle;//第一个单元格的样式
 
    private Area area;
 
    @Override
    public String getName() {
        return "merge";
    }
 
    @Override
    public Command addArea(Area area) {
        if (super.getAreaList().size() >= 1) {
            throw new IllegalArgumentException("You can add only a single area to 'merge' command");
        }
        this.area = area;
        return super.addArea(area);
    }
 
    @Override
    public Size applyAt(CellRef cellRef, Context context) {
        int rows = area.getSize().getHeight();
        int cols = area.getSize().getWidth();
        rows = Math.max(getVal(this.rows, context), rows);
        cols = Math.max(getVal(this.cols, context), cols);
        rows = Math.max(getVal(this.minRows, context), rows);
        cols = Math.max(getVal(this.minCols, context), cols);
        if(rows > 1 || cols > 1){
            Transformer transformer = this.getTransformer();
            if(transformer instanceof PoiTransformer){
                poiMerge(cellRef, context, (PoiTransformer)transformer, rows, cols);
            }else if(transformer instanceof JexcelTransformer){
                jexcelMerge(cellRef, context, (JexcelTransformer)transformer, rows, cols);
            }
        }
        area.applyAt(cellRef, context);
        return new Size(cols, rows);
    }
 
    protected Size poiMerge(CellRef cellRef, Context context, PoiTransformer transformer, int rows, int cols){
        Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
        CellRangeAddress region = new CellRangeAddress(
                cellRef.getRow(),
                cellRef.getRow() + rows - 1,
                cellRef.getCol(),
                cellRef.getCol() + cols - 1);
        sheet.addMergedRegion(region);
 
        //合并之后单元格样式会丢失,以下操作将合并后的单元格恢复成合并前第一个单元格的样式
        area.applyAt(cellRef, context);
        if(cellStyle == null){
            PoiCellData cellData = (PoiCellData)transformer.getCellData(area.getStartCellRef());
            if(cellData != null){
                cellStyle = cellData.getCellStyle();
            }
        }
        setRegionStyle(cellStyle, region, sheet);
        return new Size(cols, rows);
    }
 
    protected Size jexcelMerge(CellRef cellRef, Context context, JexcelTransformer transformer, int rows, int cols){
        try {
            transformer.getWritableWorkbook().getSheet(cellRef.getSheetName())
                    .mergeCells(
                            cellRef.getRow(),
                            cellRef.getCol(),
                            cellRef.getRow() + rows - 1 ,
                            cellRef.getCol() + cols - 1);
            area.applyAt(cellRef, context);
        } catch (WriteException e) {
            throw new IllegalArgumentException("合并单元格失败");
        }
        return new Size(cols, rows);
    }
 
    private static void setRegionStyle(CellStyle cs, CellRangeAddress region, Sheet sheet) {
        for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
            Row row = sheet.getRow(i);
            if (row == null) {
                row = sheet.createRow(i);
            }for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
                Cell cell = row.getCell(j);
                if (cell == null) {
                    cell = row.createCell(j);
                }
                if (cs == null){
                    cell.getCellStyle().setAlignment(HorizontalAlignment.CENTER);
                    cell.getCellStyle().setVerticalAlignment(VerticalAlignment.CENTER);
                }else {
                    cell.setCellStyle(cs);
                }
            }
        }
    }
 
    private int getVal(String expression, Context context){
        if(StringUtils.isNotEmpty(expression)){
            Object obj = getTransformationConfig().getExpressionEvaluator().evaluate(expression, context.toMap());
            try {
                return Integer.parseInt(obj.toString());
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("表达式:" + expression + " 解析失败");
            }
        }
        return 0;
    }
 
    public String getCols() {
        return cols;
    }
 
    public void setCols(String cols) {
        this.cols = cols;
    }
 
    public String getRows() {
        return rows;
    }
 
    public void setRows(String rows) {
        this.rows = rows;
    }
 
    public String getMinCols() {
        return minCols;
    }
 
    public void setMinCols(String minCols) {
        this.minCols = minCols;
    }
 
    public String getMinRows() {
        return minRows;
    }
 
    public void setMinRows(String minRows) {
        this.minRows = minRows;
    }
}

下面是笔者的代码

// 命令--merge
        public static void merge() throws Exception {
            InputStream is = 
                    new FileInputStream("E:\\wrc\\jxls\\study\\mergeTeplate.xlsx");
            OutputStream os = new FileOutputStream("E:\\wrc\\jxls\\study\\merge.xlsx");

XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
            JxlsHelper jxlsHelper = JxlsHelper.getInstance();
            Transformer transformer = jxlsHelper.createTransformer(is, os);

Context context = new Context();

List<Map<String,Object>> employees = new ArrayList<Map<String,Object>>();
            List<Map<String,Object>> courses = new ArrayList<Map<String,Object>>();
            Map<String,Object> hashMap = new HashMap<String,Object>();
            hashMap.put("name","Elsa" );
            hashMap.put("pay", 1500);
            
            Map<String,Object> couse = new HashMap<String,Object>();
            couse.put("name", "语文");
            couse.put("core", 98);
            courses.add(couse);
            couse = new HashMap<String,Object>();
            couse.put("name", "数学");
            couse.put("core", 94);
            courses.add(couse);
            
            hashMap.put("courses", courses);
            employees.add(hashMap);
            
            courses = new ArrayList<Map<String,Object>>();
            hashMap = new HashMap<String,Object>();
            hashMap.put("name","Oleg" );
            hashMap.put("pay", 2300);
            
            couse = new HashMap<String,Object>();
            couse.put("name", "语文");
            couse.put("core", 98);
            courses.add(couse);
            hashMap.put("courses", courses);
            
            employees.add(hashMap);
            
            courses = new ArrayList<Map<String,Object>>();
            hashMap = new HashMap<String,Object>();
            hashMap.put("name","John" );
            hashMap.put("pay", 3500);
            
            couse = new HashMap<String,Object>();
            couse.put("name", "语文");
            couse.put("core", 98);
            courses.add(couse);
            
            couse = new HashMap<String,Object>();
            couse.put("name", "语文");
            couse.put("core", 98);
            courses.add(couse);
            
            couse = new HashMap<String,Object>();
            couse.put("name", "语文");
            couse.put("core", 98);
            courses.add(couse);
            
            hashMap.put("courses", courses);
            
            employees.add(hashMap);
            
            
           
            context.putVar("employees", employees);

jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
            //JxlsUtils.exportExcel(is,os,context,true);
        }

下面是笔者的Excel

关于jxls2.6.0的学习以及遇到的问题(八)相关推荐

  1. 《ANSYS 14.0超级学习手册》一第2章 高级应用的基石——APDL

    本节书摘来自异步社区<ANSYS 14.0超级学习手册>一书中的第2章,作者 张建伟 , 白海波 , 李昕, 更多章节内容可以访问云栖社区"异步社区"公众号查看 第2章 ...

  2. 0基础学习数据分析必须掌握的技能有哪些?

    现如今,我们处于一个互联网发展的时代,大大小小的企业对于数据分析相关岗位的需求逐渐增加,因为所有的企业都有数据,企业需要让数据分析师通过整理.分析企业数据总结出企业目前的发展现状,并且为企业做出下一步 ...

  3. 资源|2019 年 11 月最新《TensorFlow 2.0 深度学习算法实战》中文版教材免费开源(附随书代码+pdf)...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送 2019 年 10 月,谷歌正式宣布,开源机器学习库 TensorFlow 2.0 现在 ...

  4. 《ANSYS 14.0超级学习手册》一第1章 绪 论

    本节书摘来自异步社区<ANSYS 14.0超级学习手册>一书中的第1章,第1.1节,作者 张建伟 , 白海波 , 李昕, 更多章节内容可以访问云栖社区"异步社区"公众号 ...

  5. 从0开始学习GitHub系列之「Git 速成」

    从0开始学习GitHub系列之「Git 速成」 糖果果| 2016-06-24 10:55    浏览量(32)    评论(0)   推荐(0) 数据 小编注:[从0开始学习 GitHub]是一个系 ...

  6. 从0开始学习GitHub系列之「认识并加入GitHub」

    从0开始学习GitHub系列之「认识并加入GitHub」 糖果果| 2016-06-16 16:01    浏览量(245)    评论(0)   推荐(0) 数据 小编注:[从0开始学习 GitHu ...

  7. 从0开始学习GitHub系列之「向GitHub 提交代码」

    DevStore首页 >文章 >文章详情 从0开始学习GitHub系列之「向GitHub 提交代码」 糖果果| 2016-06-15 10:57    浏览量(500)    评论(1) ...

  8. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  9. 400页《TensorFlow 2.0 深度学习算法实战》中文版教材免费下载(附随书代码+pdf)...

    Tensorflow自谷歌提出以来就成为最受欢迎的深度学习框架之一,到目前为止也已经被下载超过 4000 万次.其中TensorFlow2.0更是修复之前非常多的不人性的特性,备大家欢迎. 今天给大家 ...

  10. 大数据新手的0基础学习路线,从菜鸟到高手的成长之路

    大数据作为一个新兴的热门行业,吸引了很多人,但是对于大数据新手来说,按照什么路线去学习,才能够学习好大数据,实现从大数据菜鸟到高手的转变.这是很多想要学习大数据的朋友们想要了解的. 今天我们就来和大家 ...

最新文章

  1. 2022-2028年中国金融云行业市场研究及前瞻分析报告
  2. 06Chrome调试工具
  3. win10装centos双系统之后,win10的启动项消失的解决方法
  4. Eclipse python 开发环境配置
  5. nginx brotli 压缩试用
  6. v-if v-show区别(面试题)
  7. 惠普z6计算机进不去桌面,HP Z6 桌面工作站 | HP® HK 惠普香港
  8. centos 释放swap_centos6.6关闭与打开swap(整理)
  9. Lock-Free 编程
  10. python元组和列表的联系_Python | 一文看懂Python列表、元组和字符串操作
  11. html对话框跳转页面,html5各种页面切换效果和模态对话框用法总结
  12. Spring-Boot 整合Dubbo 解决@Reference 注解为null情况
  13. 条码扫描二维码扫描——ZXing android 源码简化
  14. 今天中午还收到了,一条诈骗短信,说是中奖了
  15. 计算机工程与工艺年会2019,计算机工程与工艺
  16. UL -758_2022电器布线电线电缆安全标准,刚刚发行最新版
  17. 塑胶模具注塑常用哪些材质
  18. Mysql组复制(MGR)——前提及限制
  19. 用于光波导耦合的倾斜光栅分析
  20. Packet Tracer - 配置扩展 ACL - 场景 1

热门文章

  1. 四川托普计算机职业学校教务管理系统,四川托普信息技术职业学院教务处
  2. 2021暑假牛客多校第一场A题(博弈论+暴力打表)
  3. 网页围棋对战闪亮登场(Flex+java)
  4. viper12a电源电路图_VIPER22A VIPER12A工作原理引脚功能应用电路图纸与分析
  5. 联想z5 android8,联想Z5
  6. 解决远程桌面不能用大法
  7. Fiddler - 快速入门(抓包)
  8. 2019年“深圳杯”数学建模挑战赛B题(1、2问)
  9. 一文搞懂Handler机制原理
  10. DPDK Release 20.02