一、需求背景

  在项目开发中,经常会遇到导出Excel报表文件的情况,因为很多情况下,我们需要打印Excel报表,虽然在网页上也可以生成报表,但是打印网上里的报表是无法处理排版问题的,所以最好的方式,还是生成Excel文件。

PageOffice封装了一组用于动态输出数据到Excel文档的相关类,全部包含在com.zhuozhengsoft.pageoffice.excelwriter  命名空间之中。PageOffice对Excel的赋值操作分两种方式:1. 单元格赋值,这个很好理解,sheet.openCell("D5"),返回值就是一个Cell对象;2. 针对一个区域赋值。这个区域在PageOffice的概念里就是Table对象,比如:sheet.openTable("C9:H15")的返回值就是就是Table对象,这个Table就是”C9:H15”这个区域。下面就针对这两种操作方式来分别介绍。

二、 给Excel单元格赋值

  创建Workbook对象,操作指定sheet中的指定单元格,在打开Excel文件后通过PageOfficeCtrl对象的setWriter方法把数据写入到Excel文件中:

  1. Workbook wb = new Workbook();
  2. Sheet sheet = wb.openSheet("销售订单");
  3. sheet.openCell("D5").setValue(“北京某某公司”);
  4.  
  5. PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
  6. poCtrl1.setServerPage("poserver.do");
  7. poCtrl1.setWriter(wb);
  8. poCtrl1.webOpen("{模板文件路径}", OpenModeType.xlsSubmitForm, "");

  通过上面的代码可以看出,给Excel单元格赋值,首先需要创建Workbook对象,然后通过此对象的OpenSheet方法,获取到Sheet对象,再通过Sheet对象的OpenCell方法就可以获取的Cell对象,进行赋值或其他操作。

  Sheet对象有两个方法可以获取到Cell对象:1. openCell(String CellAddress),参数为单元格引用字符串。例如:"A1";2. openCellRC(int Row, int Col),参数为excel单元格的行数和列数。所以上面给Excel单元格赋值的代码改成下面的代码也是可以的。

  1. sheet.openCellRC(5,4).setValue(“北京某某公司”);

三、设置Cell的样式

  

  这些属性不但可以用来设置单元格的前景色、背景色、边框、字体和对齐方式,甚至可以设置公式,基本上所有的单元格设置需求都可以实现。比如:设置一个单元格的背景色为为绿色。

  

  1. Workbook wb = new Workbook();
  2. wb.openSheet("Sheet1").openCell("E16").setBackColor(new Color(0, 128, 128));

  果要设置单元格的字体,就需要操作Font对象进行设置;如果要设置单元格的边框样式,就需要操作Border对象进行设置。使用Border对象设置Excel的单元格样式,是可以分别对单元格的上下左右边框单独设置样式的,所以再复杂的表格样式用PageOffice也可以“绘制”出来。PageOffice中的Table对象可以设置Table的Border样式,所以在此不作详细的叙述,下面单独用一个章节来叙述Border的设置。

四、操作Excel中的区域(Table) 

  PageOffice开发平台中,针对Excel文件的处理增加了一个“Table”的概念,一个Table指的就是一个区域,例如:sheet.OpenTable("C9:H15")的返回值就是就是Table对象,这个Table所操作的区域就是”C9:H15”。 为何需要这个Table的概念呢?下面就说明一下使用Table对象的优点。

在实际的项目需求中,常常会需要在Excel 中循环的插入多条数的数据,比如:需要在excel中以B11单元格为起始位置,插入10条包含6个字段的数据,如果使用Cell对象写一个循环程序给单元格赋值会是这样的:

  1. DataTable dt = new DataTable();
  2. for (int i = 0; i < 10; i++) // 10条数据
  3. {
  4. sheet.OpenCellRC(“B”+(11+i).ToString())Value = dt.Rows[i][0].ToString();
  5. sheet.OpenCellRC(“C”+(11+i).ToString())Value = dt.Rows[i][1].ToString();
  6. sheet.OpenCellRC(“D”+(11+i).ToString())Value = dt.Rows[i][2].ToString();
  7. sheet.OpenCellRC(“E”+(11+i).ToString())Value = dt.Rows[i][3].ToString();
  8. sheet.OpenCellRC(“F”+(11+i).ToString())Value = dt.Rows[i][4].ToString();
  9. sheet.OpenCellRC(“G”+(11+i).ToString())Value = dt.Rows[i][5].ToString();
  10. }

  如果使用Table对象编程,就与操作数据集的概念一样,代码也更灵活,代码如下:

  1. DataTable dt = new DataTable();
  2. PageOffice.ExcelWriter.Table table1 = sheet.OpenTable("B11:G20");
  3. for (int i = 0; i < 10; i++) // 10条数据
  4. {
  5. for (int j = 0; j <6; j++) // 6个字段
  6. {
  7. table1.DataFields[j].Value = dt.Rows[i][j].ToString();
  8. }
  9. table1.NextRow();
  10. }
  11. table1.Close();

  通过Cell实现这个赋值操作还有一个方法,使用OpenCellRC方法,通过行列号操作会更简单,代码如下:

  1. DataTable dt = new DataTable();
  2. for (int i = 0; i < 10; i++) // 10条数据
  3. {
  4. for (int j = 0; j <6; j++) // 6个字段
  5. {
  6. sheet.OpenCellRC(11+i,2+j )Value = dt.Rows[i][j].ToString();
  7. }
  8. }

  但是这个代码相对于Table对象的操作来说有点晦涩,只是看OpenCellRC中的参数是不容易立刻知道操作的是哪个单元格的,还有一个情况是通过Cell赋值无法做到的,那就是在已有的表格模板中插入不定行数的数据。例如:下图中的模板在“合计”之前只有10行空白行,怎么动态插入50条数据并且数据行的样式也统一呢?这种情况使用Cell是无法解决问题的,但是前面使用Table给Excel赋值的代码就可以解决这个问题。使用Table赋值的特点是:在赋值的过程中,如果Table所包含的区域行数不够,那么Table会自动插入行,并且循环重复使用Table区域中各行的样式,直到所有的数据都填充完毕。

[原创]java导出excel的更多相关文章

  1. java导出excel报错:getOutputStream() has already been called for this response

    对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...

  2. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

  3. java导出excel报表

    1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...

  4. Java导出Excel和CSV(简单Demo)

    Java导出Excel和CSV的简单实现,分别使用POI和JavaCSV. JavaBean public class ReportInfo { int id; String date; int nu ...

  5. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  6. java导出excel模板数据

    Java导出excel数据模板,这里直接贴代码开发,流程性的走下去就是步骤: String[] colName=new String[]{"期间","科目代码" ...

  7. java导出excel工具类

    java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...

  8. [转载]Java导出Excel

    一.需求介绍 当前B/S模式已成为应用开发的主流,而在开发企业办公系统的过程中,常常有客户这样子要求:把系统数据库中的数据导出到Excel,用户查看报表时直接用Excel打开.或者是:用户已经习惯用E ...

  9. JAVA导出excel 直接弹出下载框

    转自:https://blog.csdn.net/qq_38423105/article/details/80782283 效果展示: 1.首先准备jar包 <dependency>    ...

随机推荐

  1. vue2.0 仿手机新闻站(四)axios

    1.axios的配置 main.js import Vue from 'vue' import App from './App.vue' // 引入 路由 import VueRouter from ...

  2. vue2.0 引用qrcode.js实现获取改变二维码的样式

    vue代码 <template> <div class="qart"> <div id="qrcode" ref="qr ...

  3. TCP/IP详解 卷一(第四、五章 ARP、RARP)

    数据链路如 以太网都有自己的寻址机制(MAC)地址,而IP层使用的是IP地址. 当一台主机把以太网数据发送定位于同一局域网上的另一台主机时,是根据MAC地址来确定目的接口的.设备驱动程序从不检查IP数 ...

  4. sublime添加sass编译

    首先安装Ruby环境sass是基于ruby的产物,因此在安装sass前需要先安装ruby,如果用命令方式编译Sass也是必须安装ruby的.命令行编译sass见!下载Ruby windows 安装包: ...

  5. JavaScript 文件操作方法详解

    可以通过浏览器在访问者的硬盘上创建文件,因为我开始试了一下真的可以,不信你把下面这段代码COPY到一个HTML文件当中再运行一下! <script language="JavaScri ...

  6. Java 嵌套类和内部类演示样例&lt;二&gt;

    嵌套类(nested class)是一个在还有一个类或接口内部声明的类. 嵌套类分为两种:静态内部类(static inner class)和非静态嵌套类(non-static nested clas ...

  7. sqlserver中的时间比较

    例子: select count(*) from table where DATEDIFF ([second], '2004-09-18 00:00:18', '2004-09-18 00:00:19 ...

  8. HDFS源码分析EditLog之获取编辑日志输入流

    在<HDFS源码分析之EditLogTailer>一文中,我们详细了解了编辑日志跟踪器EditLogTailer的实现,介绍了其内部编辑日志追踪线程EditLogTailerThread的 ...

  9. Android Studio .9图片的应用以及制作

    参考http://www.jianshu.com/p/761f4d0e5d8d 先找到图片右键 然后修改图片名称,选择目录,注意必须要放在drawable目录里面,不然引用studio会报错 然后进入 ...

  10. iOS开发 viewWillAppear:(BOOL)animated真机调试的时候不执行了怎么办

    本文转载至http://blog.sina.com.cn/s/blog_a843a8850101e0g7.html   现在需要的.h文件里面加上. 然后,在需要的.m文件按里面加上关键代码:self ...