`
hai0378
  • 浏览: 529671 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java通过POI处理导出的合并单元格

 
阅读更多

import java.io.IOException;

 

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

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.Region;

 

 

public class ExcelTest {    

   

    /**   

     * @param args   

     */   

    public static void main(String[] args) throws IOException {    

   

        try {    

            HSSFWorkbook wb = new HSSFWorkbook();    

            HSSFSheet sheet = wb.createSheet("new   sheet");    

            HSSFCellStyle style = wb.createCellStyle(); // 样式对象    

   

            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直    

            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平    

            HSSFRow row = sheet.createRow((short) 0);    

            HSSFRow row2 = sheet.createRow((short) 1);    

   

            sheet.addMergedRegion(new Region(0, (short) 0, 1, (short) 0));    

            HSSFCell ce = row.createCell((short) 0);    

            ce.setEncoding(HSSFCell.ENCODING_UTF_16);// 中文处理    

            ce.setCellValue("项目\\日期"); // 表格的第一行第一列显示的数据    

            ce.setCellStyle(style); // 样式,居中    

            int num = 0;    

            for (int i = 0; i < 9; i++) { // 循环9次,每一次都要跨单元格显示    

                // 计算从那个单元格跨到那一格    

                int celln = 0;    

                int celle = 0;    

                if (i == 0) {    

                    celln = 0;    

                    celle = 1;    

                } else {    

                    celln = (i * 2);    

                    celle = (i * 2 + 1);    

                }    

                // 单元格合并    

                // 四个参数分别是:起始行,起始列,结束行,结束列    

                sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0,    

                        (short) (celle + 1)));    

                HSSFCell cell = row.createCell((short) (celln + 1));    

                cell.setCellValue("merging" + i); // 跨单元格显示的数据    

                cell.setCellStyle(style); // 样式    

                // 不跨单元格显示的数据,如:分两行,上一行分别两格为一格,下一行就为两格,“数量”,“金额”    

                HSSFCell cell1 = row2.createCell((short) celle);    

                HSSFCell cell2 = row2.createCell((short) (celle + 1));    

                cell1.setEncoding(HSSFCell.ENCODING_UTF_16);    

                cell1.setCellValue("数量");    

                cell1.setCellStyle(style);    

                cell2.setEncoding(HSSFCell.ENCODING_UTF_16);    

                cell2.setCellValue("金额");    

                cell2.setCellStyle(style);    

                num++;    

            }    

   

            // 在后面加上合计百分比    

   

            // 合计 在最后加上,还要跨一个单元格    

            sheet.addMergedRegion(new Region(0, (short) (2 * num + 1), 0,    

                    (short) (2 * num + 2)));    

            HSSFCell cell = row.createCell((short) (2 * num + 1));    

            cell.setEncoding(HSSFCell.ENCODING_UTF_16);    

            cell.setCellValue("合计");    

            cell.setCellStyle(style);    

            HSSFCell cell1 = row2.createCell((short) (2 * num + 1));    

            HSSFCell cell2 = row2.createCell((short) (2 * num + 2));    

            cell1.setEncoding(HSSFCell.ENCODING_UTF_16);    

            cell1.setCellValue("数量");    

            cell1.setCellStyle(style);    

            cell2.setEncoding(HSSFCell.ENCODING_UTF_16);    

            cell2.setCellValue("金额");    

            cell2.setCellStyle(style);    

   

            // 百分比 同上    

            sheet.addMergedRegion(new Region(0, (short) (2 * num + 3), 0,    

                    (short) (2 * num + 4)));    

            HSSFCell cellb = row.createCell((short) (2 * num + 3));    

            cellb.setEncoding(HSSFCell.ENCODING_UTF_16);    

           

            cellb.setCellValue("百分比");    

            cellb.setCellStyle(style);    

            

            HSSFCell cellb1 = row2.createCell((short) (2 * num + 3));    

            HSSFCell cellb2 = row2.createCell((short) (2 * num + 4));    

            cellb1.setEncoding(HSSFCell.ENCODING_UTF_16);    

            cellb1.setCellValue("数量");    

            cellb1.setCellStyle(style);    

            cellb2.setEncoding(HSSFCell.ENCODING_UTF_16);    

            cellb2.setCellValue("金额");    

            cellb2.setCellStyle(style);    

   

            /***这里是问题的关键,将这个工作簿写入到一个流中就可以输出相应的名字,这里需要写路径就ok了。

            FileOutputStream fileOut = new FileOutputStream("workbook.xls");    

            wb.write(fileOut);    

            fileOut.close();

             **/

            

            

            /**第二种是输出到也面中的excel名称

             * pName="栏目统计表";   

    response.reset();   

    response.setContentType("application/x-msdownload");   

    response.setHeader("Content-Disposition","attachment; filename="+new String(pName.getBytes("gb2312"),"ISO-8859-1")+".xls");   

    ServletOutputStream outStream=null;   

  

    try{   

        outStream = response.getOutputStream();   

        wb.write(outStream);   

    }catch(Exception e)   

    {   

     e.printStackTrace();   

    }finally{   

        outStream.close();   

    }   

             * */

            System.out.print("OK");    

        } catch (Exception ex) {    

            ex.printStackTrace();    

        }    

   

    }  

    

    

    /**  

     * 合并单元格  

     * @param sheet 要合并单元格的excel 的sheet

     * @param cellLine  要合并的列  

     * @param startRow  要合并列的开始行  

     * @param endRow    要合并列的结束行  

     */  

    private static void addMergedRegion(HSSFSheet sheet, int cellLine, int startRow, int endRow,HSSFWorkbook workBook){   

           

     HSSFCellStyle style = workBook.createCellStyle(); // 样式对象    

     

        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直    

        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平    

        //获取第一行的数据,以便后面进行比较    

        String s_will = sheet.getRow(startRow).getCell(cellLine).getStringCellValue();   

     

        int count = 0;

        boolean flag = false;

        for (int i = 1; i <= endRow; i++) {   

         String s_current = sheet.getRow(i).getCell(0).getStringCellValue(); 

         if(s_will.equals(s_current))

         {

          s_will = s_current;

          if(flag)

          {

           sheet.addMergedRegion(new CellRangeAddress(startRow-count,startRow,cellLine,cellLine));

           HSSFRow row = sheet.getRow(startRow-count);

           String cellValueTemp = sheet.getRow(startRow-count).getCell(0).getStringCellValue(); 

           HSSFCell cell = row.createCell(0);

           cell.setCellValue(cellValueTemp); // 跨单元格显示的数据    

                  cell.setCellStyle(style); // 样式    

           count = 0;

           flag = false;

          }

          startRow=i;

          count++;          

         }else{

          flag = true;

          s_will = s_current;

         }

  //由于上面循环中合并的单元放在有下一次相同单元格的时候做的,所以最后如果几行有相同单元格则要运行下面的合并单元格。

         if(i==endRow&&count>0)

         {

          sheet.addMergedRegion(new CellRangeAddress(endRow-count,endRow,cellLine,cellLine));   

          String cellValueTemp = sheet.getRow(startRow-count).getCell(0).getStringCellValue(); 

          HSSFRow row = sheet.getRow(startRow-count);

       HSSFCell cell = row.createCell(0);

       cell.setCellValue(cellValueTemp); // 跨单元格显示的数据    

                cell.setCellStyle(style); // 样式    

         }

        }

    }

   

}  

 

分享到:
评论

相关推荐

    POI操作Excel合并单元格边框问题解决方法

    POI操作Excel 合并单元格 边框问题解决方法,这个方法是我亲自测试,并运用于项目中的,可以放心使用,还一并写出了很多注释,其中有写poi的bug的解决方法

    excel poi工具类 导入 导出 合并单元格 计算公式

    这个“excel poi工具类”是利用Apache POI库来实现对Excel文件进行导入、导出、合并单元格以及处理计算公式的功能。下面我们将深入探讨这些知识点。 **1. Apache POI库介绍** Apache POI是一个开源项目,它为Java...

    POI合并单元格

    java POI导出Excel文件多表头文件

    java 后端生成pdf模板合并单元格表格的案例.docx

    ### Java后端生成PDF模板合并单元格表格案例详解 #### 概述 本文将详细介绍一个Java后端生成PDF模板,并在此基础上实现单元格合并功能的案例。案例的主要目的是展示如何在Java环境中创建复杂的表格结构,并将其导出...

    POI导出Excel工具类,自动设置标题 列名 文件名,可插入图片,合并单元格

    在这个场景中,我们关注的是如何使用POI来创建一个功能丰富的Excel导出工具类,它能够自动设置标题、列名、文件名,并且支持插入图片以及合并单元格。下面将详细介绍这些功能的实现。 首先,要创建一个Excel工作簿...

    关于java EXCEL poi 合并后无法显示或无法设置边框问题

    关于java EXCEL poi 合并后无法显示或无法设置边框问题 【本人亲测】 excel poi 新手! 坑了1.5天!

    easyuiPoi导出Excel工具类封装(支持合并单元格)

    EasyUIPoI是一款基于Apache POI的Java工具库,专门用于简化Excel的导出操作,尤其在处理模板和合并单元格方面提供了便利。这个库主要适用于那些需要在Web应用中生成Excel报告或导出数据的场景,比如数据分析、报表...

    利用poi进行excel相同内容合并单元格并转成流输出

    利用poi进行excel相同内容合并单元格,只摘要了传入部分功能,请关注addMergedRegion方法

    JAVAeasypoi根据Excel模板导出 循环遍历合并单元格处理

    【JAVA】easypoi根据Excel模板导出 循环遍历合并单元格处理

    poi生成Excel及合并单元格示例

    通过这个简单的例子,我们可以了解到如何使用 Apache POI 来生成 Excel 文件,并实现单元格的合并。在实际开发中,你可以根据需求调整单元格的样式、数据格式,甚至可以设置公式和图表等更复杂的功能。Apache POI 是...

    poi导入/导出Excel表格,合并单元格的读取和设置

    poi导入/导出Excel表格,合并单元格的读取和设置

    将HtmlTable 导出为Execl文件,支持合并单元格、合并行,无需Office支持

    总之,将HTML表格导出为Excel并支持合并单元格和合并行是一项实用的技术,它扩展了网页应用的功能,使用户能够方便地处理和分享结构化的数据。通过理解和实现这样的功能,开发者可以提升用户体验,特别是在数据报告...

    利用easyExcel导出上万条数据,自定义策略合并单元格

    本文将深入探讨如何使用阿里云开发的开源库EasyExcel来处理大数据导出,并结合Apache POI库,以及SpringBoot框架,实现上万条数据的自定义策略合并单元格导出。我们将基于提供的技术栈——EasyExcel 2.1.7,Apache ...

    java实现合并单元格的同时并导出excel示例

    Java实现合并单元格的同时并导出Excel是软件开发中常见的一种需求,特别是在报表系统和数据处理中。本文将详细介绍Java实现合并单元格的同时并导出Excel的相关知识点,并提供详细的示例代码。 首先,POI提供了API给...

    POI实战总结

    10、添加区域,合并单元格 11、保存Excel文件 12、根据单元格不同属性返回字符串数值 13、常用单元格边框格式 14、设置字体和内容位置 15、插入图片 16、调整工作表位置 17、设置打印区域 18、标注脚注 19...

    Excel报表导出,复杂Excel模板导出(带单元格合并),jxls2

    总结起来,这个项目通过`jxls2`库提供了一种高效、灵活的Excel报表导出解决方案,支持单元格合并和复杂的模板设计,能够满足多样化的需求,对于提升企业级应用的数据处理能力有着显著的作用。开发者只需花费较少的...

    使用poi方式导出excel(分多个sheet导出)

    这个过程涉及了Workbook、Sheet、Row和Cell的创建、设置数据、合并单元格以及最终的文件导出。在实际应用中,可以根据需求进行更复杂的操作,如格式化单元格、插入图表、使用公式等。总之,Apache POI为Java开发者...

    poiexcel导出html格式

    同时,注意处理合并单元格、表格样式等复杂情况。 - **写入文件**:最后,将生成的 HTML 字符串写入文件,如 `new FileOutputStream("output.html")`。 5. **性能优化**: 转换大量数据时,为了提高性能,可以...

    Java实现POI导出Excel

    实际应用中,你可能还需要处理更复杂的情况,如合并单元格、添加公式、读取数据等。POI库提供了丰富的API来支持这些功能,使得在Java中操作Excel文件变得相当便捷。通过阅读提供的博客文章,你可以获取更详细的指导...

    poi导出复杂excel

    总的来说,Apache POI为Java开发者提供了一套强大的工具,可以方便地处理Excel文件,实现各种复杂的操作,包括创建和导出带有合并行和列的表头。对于大型企业或数据分析应用,这种能力尤为关键,因为它可以极大地...

Global site tag (gtag.js) - Google Analytics