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

 更新时间:2017年03月16日 11:37:05   作者:chuquan.ou  
这篇文章主要给大家介绍了关于java实现合并单元格的同时并导出excel的相关资料,文中先进行了简单的介绍,之后给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。

介绍

POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI可以操作的文档格式有excel,word,powerpoint等,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();  
  }  
  
 }  
  
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • SpringBoot中间件之封装统一白名单配置

    SpringBoot中间件之封装统一白名单配置

    这篇文章主要介绍了SpringBoot中间件封装统一白名单配置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java实现List反转的方法总结

    Java实现List反转的方法总结

    在Java中,反转一个List意味着将其元素的顺序颠倒,使得第一个元素变成最后一个,最后一个元素变成第一个,依此类推,这一操作在处理数据集合时非常有用,所以本文给大家总结了Java实现List反转的方法,需要的朋友可以参考下
    2024-04-04
  • SpringBoot项目里集成Hibernate的示例

    SpringBoot项目里集成Hibernate的示例

    在Spring Boot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在Spring Boot项目中集成Hibernate,并提供相应的示例,感兴趣的朋友跟随小编一起看看吧
    2023-04-04
  • java 两阶段终止线程的正确做法

    java 两阶段终止线程的正确做法

    这篇文章主要给大家分享了java 两阶段终止线程的正确做法,文章列举出错误的做法与正确做法做对比,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-12-12
  • java数字转汉字工具类详解

    java数字转汉字工具类详解

    这篇文章主要为大家详细介绍了java数字转汉字工具类的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • win10操作系统下重启电脑java环境变量失效

    win10操作系统下重启电脑java环境变量失效

    这篇文章主要介绍了win10操作系统下重启电脑java环境变量失效,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot使用Validation校验参数的详细过程

    SpringBoot使用Validation校验参数的详细过程

    这篇文章主要介绍了SpringBoot使用Validation校验参数,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Java Morris遍历算法及其在二叉树中的应用

    Java Morris遍历算法及其在二叉树中的应用

    Morris遍历是一种基于线索二叉树的遍历算法,可以在不使用栈或递归的情况下,实现二叉树的前序、中序和后序遍历。该算法利用二叉树中的空指针或线索指针,将遍历序列嵌入到原二叉树中,实现了常数级别的空间复杂度,适用于对空间要求较高的场景
    2023-04-04
  • java 字符串反转的实例详解

    java 字符串反转的实例详解

    这篇文章主要介绍了java 字符串反转的实例详解的相关资料,这里提供实现代码帮助大家学习参考这部分内容,需要的朋友可以参考下
    2017-08-08
  • Java下Struts框架中的ActionForm类详解

    Java下Struts框架中的ActionForm类详解

    这篇文章主要介绍了Java下Struts框架中的ActionForm类详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论