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.合并单元格的时候要合并的单单元格必须先创建,这样方便后面再次获取这个单元格来填充数据,主要就是因为合并时不能由后向前进行合并引起的。

    1. import java.io.IOException;
    2. import org.apache.poi.hssf.usermodel.HSSFCell;
    3. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    4. import org.apache.poi.hssf.usermodel.HSSFRow;
    5. import org.apache.poi.hssf.usermodel.HSSFSheet;
    6. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    7. import org.apache.poi.hssf.util.Region;
    8. public class ExcelTest {
    9. /**
    10. * @param args
    11. */
    12. public static void main(String[] args) throws IOException {
    13. try {
    14. HSSFWorkbook wb = new HSSFWorkbook();
    15. HSSFSheet sheet = wb.createSheet("new   sheet");
    16. HSSFCellStyle style = wb.createCellStyle(); // 样式对象
    17. style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直
    18. style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平
    19. HSSFRow row = sheet.createRow((short) 0);
    20. HSSFRow row2 = sheet.createRow((short) 1);
    21. sheet.addMergedRegion(new Region(0, (short) 0, 1, (short) 0));
    22. HSSFCell ce = row.createCell((short) 0);
    23. ce.setEncoding(HSSFCell.ENCODING_UTF_16);// 中文处理
    24. ce.setCellValue("项目\\日期"); // 表格的第一行第一列显示的数据
    25. ce.setCellStyle(style); // 样式,居中
    26. int num = 0;
    27. for (int i = 0; i < 9; i++) { // 循环9次,每一次都要跨单元格显示
    28. // 计算从那个单元格跨到那一格
    29. int celln = 0;
    30. int celle = 0;
    31. if (i == 0) {
    32. celln = 0;
    33. celle = 1;
    34. } else {
    35. celln = (i * 2);
    36. celle = (i * 2 + 1);
    37. }
    38. // 单元格合并
    39. // 四个参数分别是:起始行,起始列,结束行,结束列
    40. sheet.addMergedRegion(new Region(0, (short) (celln + 1), 0,
    41. (short) (celle + 1)));
    42. HSSFCell cell = row.createCell((short) (celln + 1));
    43. cell.setCellValue("merging" + i); // 跨单元格显示的数据
    44. cell.setCellStyle(style); // 样式
    45. // 不跨单元格显示的数据,如:分两行,上一行分别两格为一格,下一行就为两格,“数量”,“金额”
    46. HSSFCell cell1 = row2.createCell((short) celle);
    47. HSSFCell cell2 = row2.createCell((short) (celle + 1));
    48. cell1.setEncoding(HSSFCell.ENCODING_UTF_16);
    49. cell1.setCellValue("数量");
    50. cell1.setCellStyle(style);
    51. cell2.setEncoding(HSSFCell.ENCODING_UTF_16);
    52. cell2.setCellValue("金额");
    53. cell2.setCellStyle(style);
    54. num++;
    55. }
    56. // 在后面加上合计百分比
    57. // 合计 在最后加上,还要跨一个单元格
    58. sheet.addMergedRegion(new Region(0, (short) (2 * num + 1), 0,
    59. (short) (2 * num + 2)));
    60. HSSFCell cell = row.createCell((short) (2 * num + 1));
    61. cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    62. cell.setCellValue("合计");
    63. cell.setCellStyle(style);
    64. HSSFCell cell1 = row2.createCell((short) (2 * num + 1));
    65. HSSFCell cell2 = row2.createCell((short) (2 * num + 2));
    66. cell1.setEncoding(HSSFCell.ENCODING_UTF_16);
    67. cell1.setCellValue("数量");
    68. cell1.setCellStyle(style);
    69. cell2.setEncoding(HSSFCell.ENCODING_UTF_16);
    70. cell2.setCellValue("金额");
    71. cell2.setCellStyle(style);
    72. // 百分比 同上
    73. sheet.addMergedRegion(new Region(0, (short) (2 * num + 3), 0,
    74. (short) (2 * num + 4)));
    75. HSSFCell cellb = row.createCell((short) (2 * num + 3));
    76. cellb.setEncoding(HSSFCell.ENCODING_UTF_16);
    77. cellb.setCellValue("百分比");
    78. cellb.setCellStyle(style);
    79. HSSFCell cellb1 = row2.createCell((short) (2 * num + 3));
    80. HSSFCell cellb2 = row2.createCell((short) (2 * num + 4));
    81. cellb1.setEncoding(HSSFCell.ENCODING_UTF_16);
    82. cellb1.setCellValue("数量");
    83. cellb1.setCellStyle(style);
    84. cellb2.setEncoding(HSSFCell.ENCODING_UTF_16);
    85. cellb2.setCellValue("金额");
    86. cellb2.setCellStyle(style);
    87. /***这里是问题的关键,将这个工作簿写入到一个流中就可以输出相应的名字,这里需要写路径就ok了。
    88. FileOutputStream fileOut = new FileOutputStream("workbook.xls");
    89. wb.write(fileOut);
    90. fileOut.close();
    91. **/
    92. /**第二种是输出到也面中的excel名称
    93. * pName="栏目统计表";
    94. response.reset();
    95. response.setContentType("application/x-msdownload");
    96. response.setHeader("Content-Disposition","attachment; filename="+new String(pName.getBytes("gb2312"),"ISO-8859-1")+".xls");
    97. ServletOutputStream outStream=null;
    98. try{
    99. outStream = response.getOutputStream();
    100. wb.write(outStream);
    101. }catch(Exception e)
    102. {
    103. e.printStackTrace();
    104. }finally{
    105. outStream.close();
    106. }
    107. * */
    108. System.out.print("OK");
    109. } catch (Exception ex) {
    110. ex.printStackTrace();
    111. }
    112. }
    113. }

java合并单元格同时导出excel的更多相关文章

  1. poi合并单元格同时导出excel

    poi合并单元格同时导出excel POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet. 跨第1行第1个到第2个单元格的操作为 sheet ...

  2. php 数据导出到excel 2种带有合并单元格的导出

    具体业务层面 可能会有所不同.以下两种方式涉及的合并单元格地方有所不同,不过基本思路是一致的. 第一种是非插件版本.可能更容易理解点,基本思路就是 组装table 然后 读取 输出到excel上.缺点 ...

  3. asp.net C#取Excel 合并单元格内容

    asp教程.net c#取excel 合并单元格内容读取excel数据,填充dataset// 连接字符串 string xlspath = server.mappath("~/www.11 ...

  4. java导出标题多行且合并单元格的EXCEL

    场景:项目中遇到有需要导出Excel的需求,并且是多行标题且有合并单元格的,参考网上的文章,加上自己的理解,封装成了可自由扩展的导出工具 先上效果,再贴代码: 调用工具类进行导出: public st ...

  5. java poi导出Excel合并单元格并设置边框

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

  6. Java导出Excel表,POI 实现合并单元格以及列自适应宽度(转载)

    POI是apache提供的一个读写Excel文档的开源组件,在操作excel时常要合并单元格,合并单元格的方法是: sheet.addMergedRegion(new CellRangeAddress ...

  7. poi导出Excel报表多表头双层表头、合并单元格

    效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @ ...

  8. poi导出excel合并单元格(包括列合并、行合并)

    1 工程所需jar包如下:commons-codec-1.5.jarcommons-logging-1.1.jarlog4j-1.2.13.jarjunit-3.8.1.jarpoi-3.9-2012 ...

  9. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

随机推荐

  1. java tomcat linux 环境变量设置

    一https://www.cnblogs.com/hanshuai/p/9604730.html :whereis java //查找java 安装路径:which java //查找java 执行路 ...

  2. 约数 求反素数bzoj1053 bzoj1257

    //约数 /* 求n的正约数集合:试除法 复杂度:O(sqrt(n)) 原理:扫描[1,sqrt(N)],尝试d能否整除n,若能,则N/d也能 */ ],m=; ;i*i<=n;i++){ ){ ...

  3. CF 449D 题解(状压+容斥)

    状压妙啊... 本题的主体思路:状压+容斥原理(或状压+数位dp) 记g[i]表示按位与后结果所有位上至少有i个1的方案数 那么根据容斥原理,ans=g[0]-g[1]+g[2]-g[3]+g[4]. ...

  4. js中字符串概念

    字符串概念:所有带单引号和双引号的叫做字符串 字符串的数据类型:字符串既是基本数据类型,又是复合数据类型. 字符串存储在内存里[只读数据段]的地方.字符串的变量里存储的是字符串的地址. [注]使用起来 ...

  5. Android Monkey压力测试环境搭建及使用

    Android Monkey压力测试学习笔记 步骤:下载SDK -> 解压进入SDK Manager下载系统 -> 配置环境变量 -> 创建虚拟设备或连接真机 -> 进入命令模 ...

  6. 用switch语句判断月份,打印出当前月份所在的季节

    var today=new Date(); var abc=today.getMonth(); switch (abc) { case 0: case 1: case 2: document.writ ...

  7. jQuery+存储过程实现无刷新分页(九)

    涉及到得知识点: 1.分页存储过程 2.分页原理 3.jQuery DOM操作 4.jQuery Ajax存取数据   效果图:

  8. 【C++ Primer 第10章】 10.4.1 插入迭代器

    目录 •  iostream迭代器 •  反向迭代器 插入迭代器 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 头文件为:#include<iterator it=t 在it指 ...

  9. 如何学习 JavaScript?

    转自:https://www.zhihu.com/question/21064817 首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要 ...

  10. 小丸工具箱FAQ

    下载地址:https://maruko.appinn.me/index.html 本文章是把一些使用小丸工具箱中常见的操作失误或出错的问题集中写出并提出解决方法,以便大家寻找解决并避免重复提问. 文章 ...