欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-04 23:59:42
介绍 poi提供api给java程序对microsoft office格式档案读和写的功能。poi可以操作的文档格式有excel,word,powerpoint等,poi...

介绍

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

总结

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