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

 }  

} 

总结

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

(0)

相关推荐

  • JavaWeb导出Excel文件并弹出下载框

    一.引言 在Java Web开发中经常涉及到报表,最近做的项目中需要实现将数据库中的数据显示为表格,并且实现导出为Excel文件的功能. 二.相关jar包 使用POI可以很好的解决Excel的导入和导出的问题,POI下载地址: poi-3.6-20091214.jar 三.关键代码 首先导入上述jar包. 在生成excel时一般数据源形式为一个List,下面把生成Excel格式的代码贴出来: /** * 以下为生成Excel操作 */ // 1.创建一个workbook,对应一个Excel文件

  • Java数据导出功能之导出Excel文件实例

    在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主.下面给出用java写入数据到excel表格方法: 1.添加jar文件 java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件.下载地址:http://www.andykhan.com/jexcelapi/ 2.jxl对Excel表格的认识 可以参见:http://www.jb51.net/article/686

  • JavaWeb动态导出Excel可弹出下载

    由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度.话不多说,上代码. ExportExcelUtil代码 package com.rixin.common.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder;

  • Java根据模板导出Excel报表并复制模板生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样 那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可) 采用的技术为 POI 导出,因为类的缘故,目前只支持2003版本的Excel. 使用前请先下载相应jar包! 后期有时间的话会进行进一步完善,初次

  • java导出数据库的全部表到excel

    本文实例为大家分享了java将某个数据库的表全部导出到excel中的方法,供大家参考,具体内容如下 第一步:如何用POI操作Excel @Test public void createXls() throws Exception{ //声明一个工作薄 HSSFWorkbook wb = new HSSFWorkbook(); //声明表 HSSFSheet sheet = wb.createSheet("第一个表"); //声明行 HSSFRow row = sheet.createR

  • Java利用POI实现导入导出Excel表格示例代码

    介绍 Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟.官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html 实现 已经在代码中加入了完整的注释. import java.io.FileInputSt

  • java导出大批量(百万以上)数据的excel文件

    本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下 1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成Workbook时清理数据,所以2007导出量更大; 2.可以导出多个excel文件到某个目录中,然后打包下载; 3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式: 代码如下: package com.e

  • Java FineReport报表工具导出EXCEL的四种方式

    在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出.分页分sheet导出和大数据量导出.对于excel2003版,限制了每个sheet的最大行数和列数,大数据量导出时会默认时分多个sheet,而excel2007不会出现这样的问题.这些导出方式在JAVA程序中分别有不同的接口来实现: 1. 原样导出 原样导出就是不预览直接导出excel 其程序接口代码如下: outputStream = new FileOutputStream(new File("E:\\Exce

  • java导出数据库中Excel表格数据的方法

    本篇文章基于java把数据库中的数据以Excel的方式导出,欢迎各位大神吐槽: 1.基于maven jar包引入如下: <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency> 2.首先创建数据库对应的实体类VO :U

  • JavaWeb中导出excel文件的简单方法

    在平时做系统项目时,经常会需要做导出功能,不论是导出excel,还是导出cvs文件.我下面的demo是在springmvc的框架下实现的. 1.JS中只需要用GET模式请求导出就可以了: $('#word-export-btn').parent().on('click',function(){ var promotionWord = JSON.stringify($('#mainForm').serializeObject()); location.href="${ctx}/promotionW

随机推荐