当前位置: 移动技术网 > IT编程>开发语言>Java > java实现合并单元格的同时并导出excel示例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

几内亚比绍共和国,地板砖颜色,四川电视台刘磊

介绍

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

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网