• poi复杂excel的实现


    一:前言

      最近帮一个朋友做excel的导出功能,对于我来说还是挺头疼,我看了下表格样式,对于我来说还是挺头疼的,想当年耗子刚刚出社会的时候做的第一份工作,第一份任务就是把把word转换为html,在这个过程中,尝试了太多方式,但是并不能保证所有的都能转换成功,复杂的word转换,依然会造成错乱。excel的导出我也还没去做过,设计到单元格的合并,我去看了看官方文档,其实也没看出什么名堂,然后就在网上查找了,下面记录下自己踩的坑吧,其实没用多久时间,从晚上八点开始做,三个小时完成,但是这之间做了很多实验。

    二:内容

      先说网上搜索的结果,我搜了"hssfrow 合并单元格",找到了两篇文章结合

        (1):http://dacoolbaby.iteye.com/blog/1630957

        (2):http://blog.csdn.net/hehexiaoyou/article/details/37873131

    先说我的测试,我把(1)中的代码弄到本地跑,但是一直报错,主要是

      

       //表示合并B2,B3  
                sheet.addMergedRegion(new Region(     
                         1, //first row (0-based)       
                        (short)1, //first column  (0-based)       
                         2, //last row (0-based)    
                        (short)1  //last column  (0-based)       
                 ));    

    主要是红色这个类,我查阅了下文档,并结合了(2)做了修改,贴上代码

    package com.mouse.moon.frepoi;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.util.CellRangeAddress;
    //测试复杂的单元格合并
    public class TestFreMergedCells {
    
        public static void main(String[] args) throws IOException {
                    HSSFWorkbook wb = new HSSFWorkbook();     
                    HSSFSheet sheet = wb.createSheet("new sheet");     
                    HSSFRow row = sheet.createRow(0);     
                    HSSFCell cell = row.createCell(0);  
                    //HSSFRow row = sheet.createRow(0);     
                    //HSSFCell cell = row.createCell(1);   cell.setCellValue("value");  这个代表设置值为(0,1)第1行第二列
                    //设置值是(0,0)代表第1行第1列,如果你想到的是我既然合并了第一列的第一行和第二行,我是否可以设置(1,0,
                    //你可以测试下,这个显然是不行的
                    cell.setCellValue("第一行第二行合并,第一列");  
                    sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
                    
                    //合并第二列的第一行第二行
                    sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1));
                    
                    //1.生成字体对象  
                    HSSFFont font = wb.createFont();  
                    font.setFontHeightInPoints((short) 10);  
                    font.setFontName("新宋体");  
                    font.setColor(HSSFColor.BLUE.index);  
                    font.setBoldweight((short) 0.8);  
                    //2.生成样式对象  
                    HSSFCellStyle style = wb.createCellStyle();  
                    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
                    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
                    style.setFont(font); //调用字体样式对象  
                    style.setWrapText(true);  
                    //增加表格边框的样式 例子  
                   style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);  
                   style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);  
                   style.setTopBorderColor(HSSFColor.GOLD.index);  
                   style.setLeftBorderColor(HSSFColor.PLUM.index);  
                   
                    //3.单元格应用样式  
                    cell.setCellStyle(style);  
                    //行:合并第一行,第二行,第三行
                    //列说明:列也是从0开始的,0代表第一列;
                    //列:合并第五列,第六列,第七列,第八列,第九列
                    HSSFRow rowOther = sheet.createRow(0);  
                    HSSFCell cellOther = rowOther.createCell(4);
                    cellOther.setCellValue("多行多列合并");
                    sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));
                    //一下代码表示在D4 cell 插入一段字符串  
                    HSSFRow row2 = sheet.createRow(3);  
                    HSSFCell cell2 = row2.createCell(3);   
                    cell2.setCellValue("只是一个数据而已");  
          
                     // Write the output to a file     
                     FileOutputStream fileOut = new FileOutputStream("/Mouse/poi/test.xls");     
                     wb.write(fileOut);     
                     fileOut.close();     
                 }     
        }

    做下简单的说明,其实自己测试也能发现,那么就是对于合并单元格设置数据的问题。

     HSSFRow rowOther = sheet.createRow(0);  
     HSSFCell cellOther = rowOther.createCell(4);
     cellOther.setCellValue("多行多列合并");
     sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));

    比如这个创建第1行(0代表第1行),第5(4代表第5列)列,下面合并了第一到第三行,第5列到第19列,那么我设置值的时候只能设置坐标为(0,4)的,如果你改为如下:

    HSSFRow rowOther = sheet.createRow(1);  
    HSSFCell cellOther = rowOther.createCell(4);
    cellOther.setCellValue("多行多列合并");
    sheet.addMergedRegion(new CellRangeAddress(0, 2, 4, 9));

    此时的赋值是第2行,第五列,其实也是在合并的单元格内,但是最后生存的表格确是没数据的。

    我做的表头是动态生成的,行也是动态的,最后导出的example如下图

    三:总结

      其实解决一个问题,只要找到了门路,然后,自己冷静的去尝试,去找文档,很多问题都不是自己想象的那么困难。好久没写博客了,其实有些,只是一直放在草稿箱的,最近应该会坚持写完发出来了。努力,这一年努力,多看书,计划照常进行。GO。

  • 相关阅读:
    FPGrowth 实现
    数据库事务的4个特性ACID
    redis简介(keeper实时报表的基本部分)
    HADOOP中的CRC数据校验文件
    潜在语义分析
    AdaBoost 算法
    cocosBuilder生成cbbi文件,绑定到cocos2d-x
    C++继承模型
    Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)
    从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/5560337.html
Copyright © 2020-2023  润新知