精华内容
下载资源
问答
  • java excel poi合并单元格
  • 主要介绍了如何使用Javaexcel单元格中设置超链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了JavaExcel单元格中应用一种/多种字体样式,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java操纵POI解析Excel表,根据表头将内容储存。通过实体类set、get方便其它方法引用
  • java excel 合并单元格

    2020-12-11 14:44:05
    easy-poi注解导出,@Excel 注解有个 needMerge 属性,属性描述:是否需要纵向合并单元格(用于含有list,单个的单元格,合并list创建的多个row),这个属性默认为false,若为true,则会将当前单元格与上

    案例

    Excel 导入导出,大部分使用 easy-poi 或者 easy-excel 两个工具类就可以了,对于简单的一行一行(像关系型数据库表记录)的导出那可真的是啪的一声,很快啊。

    就像下图这样:

    sheet1

    可是要想导出成下图:

    sheet2

    这就有点难度了。

    工具现成方法

    easy-poi

    easy-poi注解导出,@Excel 注解有个 needMerge 属性,属性描述:是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row),这个属性默认为false,若为true,则会将当前单元格与上一行同列单元格进行比较,如果一样,则会合并单元格,这样应付上图是可以的,但是要是跨列,好像就不支持了。

    easy-excel

    easy-excel 注解导出有个 @ContentLoopMerge 注解,表示每隔几列合并单元格,这样对于有固定规律的表格是没问题的,如果是 23333 这种,应该也就不支持了。

    利用 poi Api 完成

    思路
    1. 首先根据渲染的数据,根据需要合并的属性,进行分组,然后计算出,合并单元格数量
    2. 利用easy-poieasy-excel 渲染 Excel ,获得 Workbook
    3. 再根据导出sheet名称,获取Sheet
    4. 利用Sheet#addMergedRegion方法进行合并
    5. done
    计算获得合并单元格

    一般渲染都是list,可以利用 stream 操作进行 GroupBy

    
    TreeMap<String, List<E>> treeMap = list.stream()
            .collect(Collectors.groupingBy(key,
            () -> new TreeMap<String, List<E>>(comparator), 
            Collectors.toList()));
            
    List<Integer> groups = Lists.newArrayList();
    for (Map.Entry<String, List<E>> entry : treeMap.entrySet()) {
        groups.add(entry.getValue().size());
    }
    

    这里主要讲下,一定要用TreeMap这个结构,因为HashMap这种key是乱序的,一旦乱序,就会与已经导出的Excel不一致,一旦不一致,就是乱合并。

    所以groupingBy的第二个参数里面的比较器就尤为重要了,一定要用比较器去控制排序与真实Excel一致。

    分组完毕之后就是将,每个分组size记录下来,以便进行计算格子。

    /**
     * 计算合并格子
     *
     * @param startRow 表头最后行
     * @param cols     需要合并的列 数组
     * @return
     */
    public List<CellRangeAddress> computeRange(int startRow, int[] cols) {
        List<CellRangeAddress> mergeCell = Lists.newArrayList();
        for (Integer group : this.groups) {
            int interval = group;
            if (interval == 1) {
                startRow = startRow + 1;
                continue;
            }
            int beginRow = startRow;
            int endRow = beginRow + interval - 1;
            for (int col : cols) {
                CellRangeAddress range = singleRowCellRange(beginRow, endRow, col);
                mergeCell.add(range);
            }
            startRow = endRow + 1;
        }
        return mergeCell;
    }
    

    每次只能计算一个合并列,需要过滤表头以及知道合并的列,计算获得一系列的CellRangeAddress

    合并
    Sheet sheet = workbook.getSheet(sheetName);
    List<CellRangeAddress> addresses = ranges.get(sheetName);
    for (CellRangeAddress cellAddresses : addresses) {
        sheet.addMergedRegion(cellAddresses);
    }
    

    END

    按照这个方法,基本上可以实现任意合并了,只是稍微有些繁琐。我自己整理了个工具方法,可以稍微简化下流程。

    SheetMerge<TestEntity> sheetMerge = new SheetMerge(list);
    sheetMerge.range("test", TestEntity::getA, (a, b) -> CompareUtil.compare(a, b), new int[]{0}, 1);
    
    ExportParams exportParams = new ExportParams();
    exportParams.setSheetName("test");
    Workbook workbook = ExcelExportUtil.exportExcel(exportParams, TestEntity.class, list);
    sheetMerge.merge(workbook);
    @Cleanup
    BufferedOutputStream outputStream = FileUtil.getOutputStream(file_name);
    workbook.write(outputStream);
    

    最后贴下源码地址:excel-merge

    展开全文
  • java导出Excel合并单元格

    万次阅读 2019-02-12 10:09:43
    网上java导出excel表格并合并单元格的资料不完全,我整理了一份,并亲测能用,附截图。 ①java导出excel用到POI所有jar包,大家可以直接到下面地址下载点击打开链接 ②模拟数据类 package org;   public class ...

    网上java导出excel表格并合并单元格的资料不完全,我整理了一份,并亲测能用,附截图。

    ①java导出excel用到POI所有jar包,大家可以直接到下面地址下载点击打开链接

    ②模拟数据类

    package org;
     
    public class WorkSheetDetail {
        //工作内容
        private String workCtx;
        // 用工人总数    工日数 = gwnNum+tmnNum
        private Float totalHumanDays;
        //普工用工数 1-4小时为半天,4-8小时为一天;120每天
        private Integer gwnNum;
        //技工用工数 1-4小时为半天,4-8小时为一天;160每天
        private Integer tmnNum;
        // 单价(元)
        private Float unitPrice;
        // 金额(元) = gwnNum*120+tmnNum+160
        private Float unitAmount;
        // 备注
        private String notes; 
        
        public WorkSheetDetail(String workCtx, Float totalHumanDays, Integer gwnNum, Integer tmnNum, Float unitPrice,
                Float unitAmount, String notes) {
            super();
            this.workCtx = workCtx;
            this.totalHumanDays = totalHumanDays;
            this.gwnNum = gwnNum;
            this.tmnNum = tmnNum;
            this.unitPrice = unitPrice;
            this.unitAmount = unitAmount;
            this.notes = notes;
        }
        public String getWorkCtx() {
            return workCtx;
        }
        public void setWorkCtx(String workCtx) {
            this.workCtx = workCtx;
        }
        public Float getTotalHumanDays() {
            return totalHumanDays;
        }
        public void setTotalHumanDays(Float totalHumanDays) {
            this.totalHumanDays = totalHumanDays;
        }
        public Integer getGwnNum() {
            return gwnNum;
        }
        public void setGwnNum(Integer gwnNum) {
            this.gwnNum = gwnNum;
        }
        public Integer getTmnNum() {
            return tmnNum;
        }
        public void setTmnNum(Integer tmnNum) {
            this.tmnNum = tmnNum;
        }
        public Float getUnitPrice() {
            return unitPrice;
        }
        public void setUnitPrice(Float unitPrice) {
            this.unitPrice = unitPrice;
        }
        public Float getUnitAmount() {
            return unitAmount;
        }
        public void setUnitAmount(Float unitAmount) {
            this.unitAmount = unitAmount;
        }
        public String getNotes() {
            return notes;
        }
        public void setNotes(String notes) {
            this.notes = notes;
        }
        
    }

    ③java导出excel方法
    package org;
    import java.io.FileOutputStream;
    import java.util.List;
    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.HSSFHeader;
    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.ss.util.CellRangeAddress;
    public class ExportExcel {
        public void getValue(List<WorkSheetDetail> userList,FileOutputStream fout){
              try{
                    //1.创建工作簿
                    HSSFWorkbook workbook = new HSSFWorkbook();
                    //1.1创建合并单元格对象
                    CellRangeAddress callRangeAddress = new CellRangeAddress(0,0,0,7);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress1 = new CellRangeAddress(1,1,0,7);//起始行,结束行,起始列,结束列
                    //班组与时间start
                    CellRangeAddress callRangeAddress20 = new CellRangeAddress(2,2,0,2);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress21 = new CellRangeAddress(2,2,3,4);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress22 = new CellRangeAddress(2,2,5,7);//起始行,结束行,起始列,结束列
                    //班组与时间end
                    
                    //标题
                    CellRangeAddress callRangeAddress31 = new CellRangeAddress(3,4,0,0);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress32 = new CellRangeAddress(3,4,1,1);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress33 = new CellRangeAddress(3,4,2,2);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress34 = new CellRangeAddress(3,3,3,4);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress35 = new CellRangeAddress(3,4,5,5);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress36 = new CellRangeAddress(3,4,6,6);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddress37 = new CellRangeAddress(3,4,7,7);//起始行,结束行,起始列,结束列
                    
                    //金额
                    CellRangeAddress callRangeAddressnumber1 = new CellRangeAddress(userList.size()+5,userList.size()+5,0,2);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddressnumber2 = new CellRangeAddress(userList.size()+5,userList.size()+5,3,7);//起始行,结束行,起始列,结束列
     
                    //负责人
                    CellRangeAddress callRangeAddressPersion1 = new CellRangeAddress(userList.size()+6,userList.size()+6,0,2);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddressPersion2 = new CellRangeAddress(userList.size()+6,userList.size()+6,3,4);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddressPersion3 = new CellRangeAddress(userList.size()+6,userList.size()+6,5,7);//起始行,结束行,起始列,结束列
     
                    //说明
                    CellRangeAddress callRangeAddressinfo = new CellRangeAddress(userList.size()+7,userList.size()+7,0,7);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddressinfo1 = new CellRangeAddress(userList.size()+8,userList.size()+8,0,7);//起始行,结束行,起始列,结束列
                    CellRangeAddress callRangeAddressinfo2 = new CellRangeAddress(userList.size()+9,userList.size()+9,0,7);//起始行,结束行,起始列,结束列
     
                    //部项目经理部
                    HSSFCellStyle headStyle = createCellStyle(workbook,(short)10,false,true);
                    //派工单
                    HSSFCellStyle erStyle = createCellStyle(workbook,(short)13,true,true);
                    //班组和时间
                    HSSFCellStyle sanStyle = createCellStyle(workbook,(short)10,false,false);
                    //标题样式
                    HSSFCellStyle colStyle = createCellStyle(workbook,(short)10,true,true);
                    //内容样式
                    HSSFCellStyle cellStyle = createCellStyle(workbook,(short)10,false,true);
                    //2.创建工作表
                    HSSFSheet sheet = workbook.createSheet("派单");
                    //2.1加载合并单元格对象
                    sheet.addMergedRegion(callRangeAddress);
                    sheet.addMergedRegion(callRangeAddress1);
                    sheet.addMergedRegion(callRangeAddress20);
                    sheet.addMergedRegion(callRangeAddress21);
                    sheet.addMergedRegion(callRangeAddress22);
                    sheet.addMergedRegion(callRangeAddress31);
                    sheet.addMergedRegion(callRangeAddress32);
                    sheet.addMergedRegion(callRangeAddress33);
                    sheet.addMergedRegion(callRangeAddress34);
                    sheet.addMergedRegion(callRangeAddress35);
                    sheet.addMergedRegion(callRangeAddress36);
                    sheet.addMergedRegion(callRangeAddress37);
                    sheet.addMergedRegion(callRangeAddressnumber1);
                    sheet.addMergedRegion(callRangeAddressnumber2);
                    sheet.addMergedRegion(callRangeAddressPersion1);
                    sheet.addMergedRegion(callRangeAddressPersion2);
                    sheet.addMergedRegion(callRangeAddressPersion3);
                    sheet.addMergedRegion(callRangeAddressinfo);
                    sheet.addMergedRegion(callRangeAddressinfo1);
                    sheet.addMergedRegion(callRangeAddressinfo2);
                    //设置默认列宽
                    sheet.setDefaultColumnWidth(15);
                    //3.创建行
                    //3.1创建头标题行;并且设置头标题
                    HSSFRow row = sheet.createRow(0);
                    HSSFCell cell = row.createCell(0);
                    //加载单元格样式
                    cell.setCellStyle(headStyle);
                    cell.setCellValue("xxxx项目部");
                    
                    HSSFRow rower = sheet.createRow(1);
                    HSSFCell celler = rower.createCell(0);
                    //加载单元格样式
                    celler.setCellStyle(erStyle);
                    celler.setCellValue("派 工 单");
                    
                    HSSFRow rowsan = sheet.createRow(2);
                    HSSFCell cellsan = rowsan.createCell(0);
                    HSSFCell cellsan1 = rowsan.createCell(3);
                    HSSFCell cellsan2 = rowsan.createCell(5);
                    //加载单元格样式
                    cellsan.setCellStyle(sanStyle);
                    cellsan.setCellValue("协作单位:x施工一堆");
                    cellsan1.setCellStyle(sanStyle);
                    cellsan1.setCellValue("");
                    cellsan2.setCellStyle(sanStyle);
                    cellsan2.setCellValue("时间:2017年 10月 20日");
                    
                    //3.2创建列标题;并且设置列标题
                    HSSFRow row2 = sheet.createRow(3);
                    String[] titles = {"序号","工作内容","用工总人数","工日数","","单价(元)","金额(元)","备注"};//""为占位字符串
                    for(int i=0;i<titles.length;i++)
                    {
                        HSSFCell cell2 = row2.createCell(i);
                        //加载单元格样式
                        cell2.setCellStyle(colStyle);
                        cell2.setCellValue(titles[i]);
                    }
                    
                    HSSFRow rowfour = sheet.createRow(4);
                    String[] titlefour = {"普工用工数","技工用工数"};
                    for(int i=0;i<titlefour.length;i++)
                    {
                        HSSFCell cell2 = rowfour.createCell(i+3);
                        //加载单元格样式
                        cell2.setCellStyle(colStyle);
                        cell2.setCellValue(titlefour[i]);
                    }
                    
                    
                    //4.操作单元格;将用户列表写入excel
                    if(userList != null)
                    {
                        int i=1;
                        for(int j=0;j<userList.size();j++)
                        {
                            //创建数据行,前面有两行,头标题行和列标题行
                            HSSFRow row3 = sheet.createRow(j+5);
                            HSSFCell cell0 = row3.createCell(0);
                            cell0.setCellStyle(cellStyle);
                            cell0.setCellValue(i++);
                            
                            HSSFCell cell1 = row3.createCell(1);
                            cell1.setCellStyle(cellStyle);
                            cell1.setCellValue(userList.get(j).getWorkCtx());
                            
                            HSSFCell cell2 = row3.createCell(2);
                            cell2.setCellStyle(cellStyle);
                            cell2.setCellValue(userList.get(j).getTotalHumanDays());
                            
                            HSSFCell cell3 = row3.createCell(3);
                            cell3.setCellStyle(cellStyle);
                            cell3.setCellValue(userList.get(j).getGwnNum());
                            
                            HSSFCell cell4 = row3.createCell(4);
                            cell4.setCellStyle(cellStyle);
                            cell4.setCellValue(userList.get(j).getTmnNum());
                            
                            HSSFCell cell5 = row3.createCell(5);
                            cell5.setCellStyle(cellStyle);
                            cell5.setCellValue(userList.get(j).getTotalHumanDays());
                            
                            HSSFCell cell6 = row3.createCell(6);
                            cell6.setCellStyle(cellStyle);
                            cell6.setCellValue(userList.get(j).getUnitAmount());
                            
                            HSSFCell cell7= row3.createCell(7);
                            cell7.setCellStyle(cellStyle);
                            cell7.setCellValue(userList.get(j).getUnitPrice());
                        }
                    }
                    
                    HSSFRow rownumber = sheet.createRow(userList.size()+5);
                    HSSFCell cellnumber = rownumber.createCell(0);
                    HSSFCell cellnumber1 = rownumber.createCell(3);
                    //加载单元格样式
                    cellnumber.setCellStyle(sanStyle);
                    cellnumber.setCellValue("金额合计(大写)");
                    cellnumber1.setCellStyle(sanStyle);
                    cellnumber1.setCellValue("¥ 78 元; 大写:柒拾捌元整");
     
                    HSSFRow rowpersion = sheet.createRow(userList.size()+6);
                    HSSFCell cellpersion = rowpersion.createCell(0);
                    HSSFCell cellpersion1 = rowpersion.createCell(3);
                    HSSFCell cellpersion2 = rowpersion.createCell(5);
     
                    //加载单元格样式
                    cellpersion.setCellStyle(sanStyle);
                    cellpersion.setCellValue("协作单位负责人:");
                    cellpersion1.setCellStyle(sanStyle);
                    cellpersion1.setCellValue("经办人:");
                    cellpersion2.setCellStyle(sanStyle);
                    cellpersion2.setCellValue("部门负责人:");
                    
                    HSSFRow rowinfo = sheet.createRow(userList.size()+7);
                    HSSFCell cellinfo = rowinfo.createCell(0);
                    cellinfo.setCellStyle(sanStyle);
                    cellinfo.setCellValue("说明:1、本标工单一式两联,第一联为派工人(工长)存根,第二联用作结算。");
                    
                    HSSFRow rowinfo1 = sheet.createRow(userList.size()+8);
                    HSSFCell cellinfo1 = rowinfo1.createCell(0);
                    cellinfo1.setCellStyle(sanStyle);
                    cellinfo1.setCellValue("2、本标工单必须在用工当日签认,否则不予认可;三日内交合同处汇总。");
                    
                    HSSFRow rowinfo2 = sheet.createRow(userList.size()+9);
                    HSSFCell cellinfo2 = rowinfo2.createCell(0);
                    cellinfo2.setCellStyle(sanStyle);
                    cellinfo2.setCellValue("3、工日数填写精确到半个工日。");
                    //5.输出
                    workbook.write(fout);
    //                workbook.close();
                    //out.close();
                }catch(Exception e)
                {
                    e.printStackTrace();
                }
        }
        
        /**
         * 
         * @param workbook
         * @param fontsize
         * @return 单元格样式
         */
        private static HSSFCellStyle createCellStyle(HSSFWorkbook workbook, short fontsize,boolean flag,boolean flag1) {
            // TODO Auto-generated method stub
            HSSFCellStyle style = workbook.createCellStyle();
            //是否水平居中
            if(flag1){
                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
            }
           
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
            //创建字体
            HSSFFont font = workbook.createFont();
            //是否加粗字体
            if(flag){
                font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            }
            font.setFontHeightInPoints(fontsize);
            //加载字体
            style.setFont(font);
            return style;
        }
    }


    ④main方法
    package org;
     
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.List;
     
    public class MainOut {
        public static void main(String args[]){
            //模拟部分数据
            List<WorkSheetDetail> detail = new ArrayList<WorkSheetDetail>();
     
            WorkSheetDetail d1 =new WorkSheetDetail("23",23f,43,34,243f,54f,"34");
            WorkSheetDetail d2 =new WorkSheetDetail("23",23f,43,34,243f,54f,"34");
            WorkSheetDetail d3 =new WorkSheetDetail("23",23f,43,34,243f,54f,"34");
            WorkSheetDetail d4 =new WorkSheetDetail("23",23f,43,34,243f,54f,"34");
            WorkSheetDetail d5 =new WorkSheetDetail("23",23f,43,34,243f,54f,"34");
            detail.add(d1);
            detail.add(d2);
            detail.add(d3);
            detail.add(d4);
            detail.add(d5);
            try  
            {  
                FileOutputStream fout = new FileOutputStream("E:/students.xls");
                new ExportExcel().getValue(detail, fout);
                fout.close();  
            }  
            catch (Exception e)  
            {  
                e.printStackTrace();  
            }  
     
        }
    }

    ⑤截图

     

    --------------------- 
    作者:datangxiajun 
    来源:CSDN 
    原文:https://blog.csdn.net/datangxiajun/article/details/78308979 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 主要给大家介绍了关于java实现合并单元格的同时并导出excel的相关资料,文中先进行了简单的介绍,之后给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
  • Java导出 Excel设置单元格格式

    万次阅读 2019-09-11 10:54:30
    1.设置单元格为文本格式 HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle(); HSSFDataFormat format = demoWorkBook.createDataFormat(); cellStyle2.setDataFormat(format.getFormat("@")); cell....
    HSSFWorkbook demoWorkBook = new HSSFWorkbook();   
    HSSFSheet demoSheet = demoWorkBook.createSheet("The World's 500 Enterprises");   
    HSSFCell cell = demoSheet.createRow(0).createCell(0);
    

    1.设置单元格为文本格式

     HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle();
     HSSFDataFormat format = demoWorkBook.createDataFormat();
     cellStyle2.setDataFormat(format.getFormat("@"));
     cell.setCellStyle(cellStyle2);
    

    2.设置单元格为日期格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
    HSSFDataFormat format= demoWorkBook.createDataFormat();
    cellStyle.setDataFormat(format.getFormat("yyyy-MM-dd"));
    cell.setCellStyle(cellStyle);
    

    3.设置单元格保留两位小数格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();    
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
    cell.setCellStyle(cellStyle);
    

    4.设置单元格为货币格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
    HSSFDataFormat format= demoWorkBook.createDataFormat();
    cellStyle.setDataFormat(format.getFormat("¥#,##0"));
    cell.setCellStyle(cellStyle);
    

    5.设置单元格为百分比格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
    cell.setCellStyle(cellStyle);
    

    6.设置单元格为中文大写格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
    HSSFDataFormat format= demoWorkBook.createDataFormat();
    cellStyle.setDataFormat(format.getFormat("[DbNum2][$-804]0"));
    cell.setCellStyle(cellStyle);
    

    7.设置单元格为科学计数法格式

    HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
    cellStyle.setDataFormat( HSSFDataFormat.getBuiltinFormat("0.00E+00"));
    cell.setCellStyle(cellStyle);
    
    展开全文
  • Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。 需要的mavan依赖...

     Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

    需要的mavan依赖:

           <!-- Excel poi -->
           <dependency>
    		   <groupId>org.apache.poi</groupId>
    		   <artifactId>poi</artifactId>
    		   <version>3.9</version>
    		</dependency>
    		<dependency>
    		   <groupId>org.apache.poi</groupId>
    		   <artifactId>poi-ooxml</artifactId>
    		   <version>3.9</version>
    		</dependency>
    		<dependency>
    		   <groupId>org.apache.poi</groupId>
    		   <artifactId>poi-ooxml-schemas</artifactId>
    		   <version>3.9</version>
    		</dependency>

    ExcelUtil.java

    package com.citywy.controller;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.*;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    public class ExcelUtil {
        public static void main(String[] args){
            ExcelUtil excelUtil = new ExcelUtil();
            //读取excel数据
            ArrayList<Map<String,String>> result = excelUtil.readExcelToObj("d:\\first\\a.xlsx");
            for(Map<String,String> map:result){
                System.out.println("输出:"+map);
            }
        }
        /**
         * 读取excel数据
         * @param path
         */
        private ArrayList<Map<String,String>> readExcelToObj(String path) {
    
            Workbook wb = null;
            ArrayList<Map<String,String>> result = null;
            try {
                wb = WorkbookFactory.create(new File(path));
                result = readExcel(wb, 0, 1, 0);
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 读取excel文件
         * @param wb
         * @param sheetIndex sheet页下标:从0开始
         * @param startReadLine 开始读取的行:从0开始
         * @param tailLine 去除最后读取的行
         */
        private ArrayList<Map<String,String>> readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) {
            Sheet sheet = wb.getSheetAt(sheetIndex);
            Row row = null;
            ArrayList<Map<String,String>> result = new ArrayList<Map<String,String>>();
            for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {
    
                row = sheet.getRow(i);
                Map<String,String> map = new HashMap<String,String>();
                for(Cell c : row) {
                    String returnStr = "";
                    boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
                    //判断是否具有合并单元格
                    if(isMerge) {
                        String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
    //                    System.out.print(rs + "------ ");
                        returnStr = rs;
                    }else {
    //                    System.out.print(c.getRichStringCellValue()+"++++ ");
                        returnStr = c.getRichStringCellValue().getString();
                    }
                    if(c.getColumnIndex()==0){
                        map.put("id",returnStr);
                    }else if(c.getColumnIndex()==1){
                        map.put("base",returnStr);
                    }else if(c.getColumnIndex()==2){
                        map.put("siteName",returnStr);
                    }else if(c.getColumnIndex()==3){
                        map.put("articleName",returnStr);
                    }else if(c.getColumnIndex()==4){
                        map.put("mediaName",returnStr);
                    }else if(c.getColumnIndex()==5){
                        map.put("mediaUrl",returnStr);
                    }else if(c.getColumnIndex()==6){
                        map.put("newsSource",returnStr);
                    }else if(c.getColumnIndex()==7){
                        map.put("isRecord",returnStr);
                    }else if(c.getColumnIndex()==8){
                        map.put("recordTime",returnStr);
                    }else if(c.getColumnIndex()==9){
                        map.put("remark",returnStr);
                    }
                }
                result.add(map);
            }
            return result;
        }
    
        /**
         * 获取合并单元格的值
         * @param sheet
         * @param row
         * @param column
         * @return
         */
        public String getMergedRegionValue(Sheet sheet ,int row , int column){
            int sheetMergeCount = sheet.getNumMergedRegions();
            for(int i = 0 ; i < sheetMergeCount ; i++){
                CellRangeAddress ca = sheet.getMergedRegion(i);
                int firstColumn = ca.getFirstColumn();
                int lastColumn = ca.getLastColumn();
                int firstRow = ca.getFirstRow();
                int lastRow = ca.getLastRow();
                if(row >= firstRow && row <= lastRow){
                    if(column >= firstColumn && column <= lastColumn){
                        Row fRow = sheet.getRow(firstRow);
                        Cell fCell = fRow.getCell(firstColumn);
                        return getCellValue(fCell) ;
                    }
                }
            }
            return null ;
        }
    
        /**
         * 判断合并了行
         * @param sheet
         * @param row
         * @param column
         * @return
         */
        private boolean isMergedRow(Sheet sheet,int row ,int column) {
            int sheetMergeCount = sheet.getNumMergedRegions();
            for (int i = 0; i < sheetMergeCount; i++) {
                CellRangeAddress range = sheet.getMergedRegion(i);
                int firstColumn = range.getFirstColumn();
                int lastColumn = range.getLastColumn();
                int firstRow = range.getFirstRow();
                int lastRow = range.getLastRow();
                if(row == firstRow && row == lastRow){
                    if(column >= firstColumn && column <= lastColumn){
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * 判断指定的单元格是否是合并单元格
         * @param sheet
         * @param row 行下标
         * @param column 列下标
         * @return
         */
        private boolean isMergedRegion(Sheet sheet,int row ,int column) {
            int sheetMergeCount = sheet.getNumMergedRegions();
            for (int i = 0; i < sheetMergeCount; i++) {
                CellRangeAddress range = sheet.getMergedRegion(i);
                int firstColumn = range.getFirstColumn();
                int lastColumn = range.getLastColumn();
                int firstRow = range.getFirstRow();
                int lastRow = range.getLastRow();
                if(row >= firstRow && row <= lastRow){
                    if(column >= firstColumn && column <= lastColumn){
                        return true;
                    }
                }
            }
            return false;
        }
    
        /**
         * 判断sheet页中是否含有合并单元格
         * @param sheet
         * @return
         */
        private boolean hasMerged(Sheet sheet) {
            return sheet.getNumMergedRegions() > 0 ? true : false;
        }
    
        /**
         * 合并单元格
         * @param sheet
         * @param firstRow 开始行
         * @param lastRow 结束行
         * @param firstCol 开始列
         * @param lastCol 结束列
         */
        private void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
            sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
        }
    
        /**
         * 获取单元格的值
         * @param cell
         * @return
         */
        public String getCellValue(Cell cell){
    
            if(cell == null) return "";
    
            if(cell.getCellType() == Cell.CELL_TYPE_STRING){
    
                return cell.getStringCellValue();
    
            }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
    
                return String.valueOf(cell.getBooleanCellValue());
    
            }else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
    
                return cell.getCellFormula() ;
    
            }else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
    
                return String.valueOf(cell.getNumericCellValue());
    
            }
            return "";
        }
        /**
         * 从excel读取内容
         */
        public static void readContent(String fileName)  {
            boolean isE2007 = false;    //判断是否是excel2007格式
            if(fileName.endsWith("xlsx"))
                isE2007 = true;
            try {
                InputStream input = new FileInputStream(fileName);  //建立输入流
                Workbook wb  = null;
                //根据文件格式(2003或者2007)来初始化
                if(isE2007)
                    wb = new XSSFWorkbook(input);
                else
                    wb = new HSSFWorkbook(input);
                Sheet sheet = wb.getSheetAt(0);     //获得第一个表单
                Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
                while (rows.hasNext()) {
                    Row row = rows.next();  //获得行数据
                    System.out.println("Row #" + row.getRowNum());  //获得行号从0开始
                    Iterator<Cell> cells = row.cellIterator();    //获得第一行的迭代器
                    while (cells.hasNext()) {
                        Cell cell = cells.next();
                        System.out.println("Cell #" + cell.getColumnIndex());
                        switch (cell.getCellType()) {   //根据cell中的类型来输出数据
                            case HSSFCell.CELL_TYPE_NUMERIC:
                                System.out.println(cell.getNumericCellValue());
                                break;
                            case HSSFCell.CELL_TYPE_STRING:
                                System.out.println(cell.getStringCellValue());
                                break;
                            case HSSFCell.CELL_TYPE_BOOLEAN:
                                System.out.println(cell.getBooleanCellValue());
                                break;
                            case HSSFCell.CELL_TYPE_FORMULA:
                                System.out.println(cell.getCellFormula());
                                break;
                            default:
                                System.out.println("unsuported sell type======="+cell.getCellType());
                                break;
                        }
                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    附加个人需求:

    /**
    	 * str最后一行读不到,手动最后加一行废数据
    	 * 附加:将读取的内容合并为	
    	 * 【高危职业】什么是高危职业_十大高危职业_xxx_xxx_xxx 最多8条
    	 * 所属栏目读取最后一个/后的值  职业病防治 
    	 */
        public static void main(String[] args){
            ExcelUtil excelUtil = new ExcelUtil();
            //读取excel数据
            ArrayList<Map<String,String>> result = excelUtil.readExcelToObj("d:\\xreadexcel\\a.xlsx");
            Map<String, Object> result1 = new HashMap<String, Object>();
            String str="";
            for(Map<String,String> map:result){
                String id = map.get("id");
                String value = map.get("base");
                String menu = map.get("siteName");
                if(menu.contains("/")){
                	menu=menu.substring(menu.lastIndexOf("/")+1);
                }
        		if(result1.containsKey(id)){
        			if(getCount(str, "_")<7){
        				str=str+"_"+value;	
        			}
        		}else{
        			if(!str.equals("")){
        				System.out.println(str);	//【高危职业】什么是高危职业_十大高危职业_..._..._...最多8条
        			}
        			//System.out.println(id);	//高危职业
        			//System.out.println(menu.trim());//职业病防治 
        			str="【"+id+"】"+value;
        			result1.put(id, value);
        		}
            }
        }
        /**
         * 获取字符串指定字符个数
         * @param str
         * @param tag
         * @return
         */
        public static int getCount(String str, String tag) {
    		int index = 0;
    		int count = 0;	   
    		while ((index = str.indexOf(tag)) != -1 ) {
    			 str = str.substring(index + tag.length()); 
    			 count++;
    		}
    		return count;
    	}

    转载:https://www.cnblogs.com/jiuchongxiao/p/5659884.html

    展开全文
  • 合并单元格代码: CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 1, 0, 0); sheet.addMergedRegion(cellRangeAddress); //加入边框 setBorderStyle(BorderStyle.THIN, cellRangeAddress, sheet);...
  • java导出excel合并单元格及设置

    千次阅读 2019-04-23 15:16:12
    package checkout_excel; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class MainOut { public static void main(String args[]){ //模拟部分数据 ...
  • 小弟 在最近做项目,需要打印报表操作,在合并单元格时出现了下面的问题 ![图片说明](https://img-ask.csdn.net/upload/201710/26/1508990821_201301.png) 报错部分代码 ![图片说明]...
  • Java导出Excel合并单元格

    千次阅读 2019-02-07 13:56:11
    Java导出Excel合并单元格
  • 在实现java poi对excel表操纵的过程,想要把数据填入excel表格里面的某个坐标里面的时候。去百度的过程发现都是先拿到row的坐标,然后拿到那个row的cell的坐标,都是从0下标开始的,这种操作写一片数据当然...
  • JAVAExcel合并单元格数据读取

    千次阅读 2018-10-26 10:54:37
    使用poi解析excel后,若为合并单元格,仅第一行有数据,后面的合并单元格没有数据; 解决办法 判断cell是否为合并单元格,之后分类处理 //判断是否为合并行 if(isMergedRegion(sheet,j,0)){ int lastRow = ...
  • Java读取Excel中单元格数据

    千次阅读 2018-05-21 13:53:37
    目前网上能找到的读取Excel表格数据的两种比较好的方案:PageOffice好用开发效率高;POI免费。供大家参考,针对具体情况选择具体方案。 1. PageOffice读取excel import com.zhuozhengsoft.pageoffice.*; ...
  • //在excel中创建一行 row0.createCell(0).setCellValue("月份");//在第一个格子放入月份 row0.createCell(1).setCellValue("第二个单元格"); row0.createCell(2).setCellValue("横向合并...
  • JAVA excel合并单元格原生poi 合并后的效果 直接上代码 (该方法为如果指定行的单元格里面的值一致则进行合并,直接粘贴使用即可) * * @param sheet * @param colIdx 合并的列 * @param startRow 起始行 * @...
  • Java 查看Excel单元格背景填充色

    千次阅读 2020-06-18 10:09:06
    Workbook workbook = excelTest3.getExcel("C:\\Users\\beawan\\Desktop\\test\\test.xlsx"); excelTest3.analyzeExcel(workbook); } public Workbook getExcel(String filePath){ Workbook wb=null; File file=new...
  • JAVA POI导出Excel设置单元格类型

    千次阅读 2019-01-15 17:10:54
    HSSFRow Row = sheet.createRow(sheet.getLastRowNum()+1); Row.getCell(0).setCellType...//设置单元格为数值类型 Row.getCell(0).setCellType(HSSFCell.CELL_TYPE_STRING);//设置单元格为字符串类型 Row.get...
  • //合并单元格 sheet.addMergedRegion(new CellRangeAddress(0,0,2,6));//起始行,结束行,起始列,结束列 // 设置 列宽 1.第几列 2.尺寸 sheet.setColumnWidth((short) (7), (short) (30*200));
  • java,excel实现单元格合并导入

    千次阅读 2018-05-12 11:08:04
    需要导入excel的样子 代码:说明 最多支持5级目录导入 package net.parim.spark.unicom.provider.careercenter.service; import java.io.File; import java.io.FileInputStream; import java.io....
  • java poi Excel导出单元格背景颜色设置

    千次阅读 2017-04-06 17:04:19
    package com.java.connect.poi;...import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.po
  • Java 读取excel解析合并单元格

    千次阅读 2019-11-07 13:49:35
    解析这个excel 空格填写e ,单元格合并的拆分后填写合并前的值 id 啊 哦 额 1 2 2 3 2 e e 3 3 4 4 3 4 4 4 3 5 0 0 2019-09-01 code 依赖 <dependency> <groupId>org.apache.poi</...
  • 最近做项目遇到的坑,百度了半天导出都为货币类型、自定义类型和常规类型,,,最后终于解决,在此记录一下 ... * 设置Excel单元格为数值类型便于公式运算 * * @param workbook * @param contextstyle
  • java读取Excel(包含合并单元格)

    千次阅读 2019-10-23 16:09:31
    //这里把 Excel取到的数据存到数据库 String s = RoomArrangement ( bunkLibraryId ) ; if ( s == "ok" ) { return 1 ; } } catch ( Exception e ) { logger . error ( ...
  • java POI实现Excel单元格内容换行

    千次阅读 2019-09-11 19:39:24
    // 在excel添加表头 for ( int i = 0 ; i < headers . length ; i ++ ) { titleRow . createCell ( i ) . setCellValue ( headers [ i ] ) ; } String content = String . join ( ...
  • Java poi操作Excel单元格样式

    万次阅读 2020-12-31 19:19:57
    Java poi设置Excel单元格格式设置 XSSFWorkbook xwb = new XSSFWorkbook();或者 XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream("xxx/xx/xx/xxxx.xlsx")); CellStyle cellStyle = xwb.createCellStyle...
  • java poi设置Excel单元格颜色

    千次阅读 2018-12-25 13:29:28
    CellStyle cellStyle = wb.createCellStyle(); cellStyle.setFillPattern(HSSFCellStyle.SOLID_... //填充单元格 cellStyle.setFillForegroundColor(HSSFColor.RED.index); //填红色 r.getCell(1).setCellStyle...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,273
精华内容 11,709
关键字:

java更新excel中的单元格

java 订阅