zoukankan      html  css  js  c++  java
  • poi合并单元格同时导出excel

    poi合并单元格同时导出excel

    POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。 

    跨第1行第1个到第2个单元格的操作为 
    sheet.addMergedRegion(new Region(0,(short)0,0,(short)1)); 

    跨第1行第1个到第2行第1个单元格的操作为 
    sheet.addMergedRegion(new Region(0,(short)0,1,(short)0)); 


    重点注意事项: 
    1.单元格CELL和ROW对象下标都是从0开始的。 
    2.单元格合并时Region(1,2,3,4)第1个值的行号必须要比3位置的行号小,如果大于3就不能正常合并单元格 
    3.合并单元格的时候要合并的单单元格必须先创建,这样方便后面再次获取这个单元格来填充数据,主要就是因为合并时不能由后向前进行合并引起的。 

    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();    

            }    

       

        }    

       

    }  

    幸运之神的降临,往往只是因为你多看了一眼,多想了一下,多走了一步
  • 相关阅读:
    那是什么进程 —— svchost.exe是什么? 它为何运行?
    共享一下我的博客皮肤
    C#3.0亮点 —— 关键字var和匿名类型
    改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)
    C#3.0亮点 —— 分部方法
    解决C#中一个"异步方法却同步执行"的问题
    改善代码设计 —— 简化函数调用(Making Method Calls Simpler)
    改善代码设计 —— 总结篇(Summary)
    理解A*寻路算法具体过程
    改善代码设计 —— 组织好你的数据(Composing Data)
  • 原文地址:https://www.cnblogs.com/gsxdream/p/3738786.html
Copyright © 2011-2022 走看看