/**
* 导出导出采暖市场部收入、成本、利润明细表
* @author JIA-G-Y
*/
public String exporExcel(String str) {

  String str=ServletActionContext.getServletContext().getRealPath("\\statics\\attachment\\excel\\");
  String path = str+"\\user.xls";

try {
List<WholesaleAgreementMaterialExportExcelTemplate> list = agreementDao.selectAllWholeDetails();
// 打开文件
WritableWorkbook book = Workbook.createWorkbook( new File(path));
// 生成名为“第一页”的工作表,参数0表示这是第一页
WritableSheet sheet = book.createSheet( " 第一页 " , 0 );
SheetSettings ss = sheet.getSettings();
// ss.setHorizontalFreeze(2); // 设置列冻结
ss.setVerticalFreeze(2); // 设置行冻结前2行 WritableFont font1 =new WritableFont(WritableFont.createFont("微软雅黑"), 10 ,WritableFont.BOLD);
WritableFont font2 =new WritableFont(WritableFont.createFont("微软雅黑"), 9 ,WritableFont.NO_BOLD);
WritableCellFormat wcf = new WritableCellFormat(font1);
WritableCellFormat wcf2 = new WritableCellFormat(font2);
WritableCellFormat wcf3 = new WritableCellFormat(font2);//设置样式,字体 // wcf2.setBackground(Colour.LIGHT_ORANGE);
wcf.setAlignment(Alignment.CENTRE); //平行居中
wcf.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf3.setAlignment(Alignment.CENTRE); //平行居中
wcf3.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中
wcf3.setBackground(Colour.LIGHT_ORANGE);
wcf2.setAlignment(Alignment.CENTRE); //平行居中
wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); //垂直居中 sheet.mergeCells( 1 , 0 , 13 , 0 ); // 合并单元格 // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)
// 以及单元格内容为test
Label titleLabel = new Label( 1 , 0 , " 采暖市场部收入、成本、利润明细表 ",wcf);
// 将定义好的单元格添加到工作表中
sheet.addCell(titleLabel);
sheet.setRowView(1, 500); // 设置第一行的高度 20121111
int[] headerArrHight = {13,10,30,20,20,25,7,10,15,20,13,15,15,30};
String headerArr[] = {"年份","月份","经销商","合同号","产品","规格","数量","单价(元)","收款金额(元)","收款不含税价(元)","成本(元)","毛利(元)","毛利率","备注"};
for (int i = 0; i < headerArr.length; i++) {
sheet.addCell(new Label( i , 1 , headerArr[i],wcf));
sheet.setColumnView(i, headerArrHight[i]);
}
DecimalFormat df = new DecimalFormat("#.00");
int conut = 2;
for (int i = 0; i < list.size(); i++) { //循环一个list里面的数据到excel中
sheet.addCell(new Label( 0 , conut ,list.get(i).getFromDate().substring(0, 4) + "年" ,wcf2));
sheet.addCell(new Label( 1 , conut ,list.get(i).getFromDate().substring(4, 6) + "月" ,wcf2));
sheet.addCell(new Label( 2 , conut ,list.get(i).getCustomerName() ,wcf2));
sheet.addCell(new Label( 3 , conut ,list.get(i).getAgreementCode() ,wcf2));
sheet.addCell(new Label( 4 , conut ,list.get(i).getBrandName() ,wcf2));
sheet.addCell(new Label( 5 , conut ,list.get(i).getType() ,wcf2));
sheet.addCell(new Label( 6 , conut ,list.get(i).getQuantity().substring(0, list.get(i).getQuantity().indexOf(".")) ,wcf2));
sheet.addCell(new Label( 7 , conut ,list.get(i).getUnivalent() ,wcf2));
sheet.addCell(new Label( 8 , conut ,list.get(i).getReceiptAmount()+"" ,wcf2));// 收款金额
sheet.addCell(new Label( 9 , conut ,df.format(list.get(i).getReceiptNoTax()) ,wcf2));// 收款不含税价
sheet.addCell(new Label( 10 , conut ,list.get(i).getCost()+"" ,wcf2));//成本
sheet.addCell(new Label( 11 , conut ,df.format(list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1)))) ,wcf2));// 毛利
BigDecimal bigDecimal = list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1)));
double bigDecimal2 = bigDecimal.doubleValue()/list.get(i).getReceiptNoTax().doubleValue();
sheet.addCell(new Label( 12 , conut ,(df.format(bigDecimal2*100)) + "%" ,wcf2));
sheet.addCell(new Label( 13 , conut ,list.get(i).getRemark() ,wcf2));
sheet.setRowView(conut, 370); // 设置第一行的高度
conut++;
}
sheet.setRowView(list.size() + 2, 370);
sheet.setRowView(list.size() + 3, 370);
sheet.setRowView(list.size() + 4, 370);
sheet.setRowView(list.size() + 5, 370); double sumZ = 0.00; //收款总额
double sumT = 0.00; // 收款不含税价
double sumC = 0.00; // 成本
double sumM = 0.00; // 毛利
for (int i = 0; i < list.size(); i++) {
sumZ += list.get(i).getReceiptAmount().doubleValue();
sumT += list.get(i).getReceiptNoTax().doubleValue();
sumC += list.get(i).getCost().doubleValue();
sumM += list.get(i).getReceiptNoTax().add(list.get(i).getCost().multiply(new BigDecimal(-1))).doubleValue();
}
sheet.addCell(new Label( 0 , list.size() + 3 ,"合计:" ,wcf));
sheet.addCell(new Label( 8 , list.size() + 3 ,df.format(sumZ) ,wcf));
sheet.addCell(new Label( 9 , list.size() + 3 ,df.format(sumT) ,wcf));
sheet.addCell(new Label( 10 , list.size() + 3, df.format(sumC) ,wcf));
sheet.addCell(new Label( 11 , list.size() + 3 ,df.format(sumM) ,wcf));
sheet.addCell(new Label( 13 , list.size() + 5 ,"导出时间:" + new Date().toLocaleString() ,wcf3)); // 写入数据并关闭文件
book.write();
book.close();
return path;
} catch (Exception e) {
}
return path;
}

jxl是java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式。

使用如下:

搭建环境

将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。

基本操作

一、创建文件

拟生成一个名为“test.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:

package test; // 生成Excel的类 import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class CreateExcel { public static void main(String args[]) { try { // 打开文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " )); // 生成名为“第一页”的工作表,参数0表示这是第一页 WritableSheet sheet = book.createSheet( " 第一页 " , 0 ); // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0) // 以及单元格内容为test Label label = new Label( 0 , 0 , " test " ); // 将定义好的单元格添加到工作表中 sheet.addCell(label); jxl.write.Number number = new jxl.write.Number( 1 , 0 , 555.12541 ); sheet.addCell(number); // 写入数据并关闭文件 book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } }

编译执行后,会产生一个Excel文件。

二、读取文件

以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:

package test; // 读取Excel的类 import java.io.File; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; public class ReadExcel { public static void main(String args[]) { try { Workbook book = Workbook.getWorkbook( new File( " test.xls " )); // 获得第一个工作表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 Cell cell1 = sheet.getCell( 0 , 0 ); String result = cell1.getContents(); System.out.println(result); book.close(); } catch (Exception e) { System.out.println(e); } } }

程序执行结果:test

三、修改文件

利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:

package test; import java.io.File; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class UpdateExcel { public static void main(String args[]) { try { // Excel获得文件 Workbook wb = Workbook.getWorkbook( new File( " test.xls " )); // 打开一个文件的副本,并且指定数据写回到原文件 WritableWorkbook book = Workbook.createWorkbook( new File( " test.xls " ), wb); // 添加一个工作表 WritableSheet sheet = book.createSheet( " 第二页 " , 1 ); sheet.addCell( new Label( 0 , 0 , " 第二页的测试数据 " )); book.write(); book.close(); } catch (Exception e) { System.out.println(e); } } }

四、 数据格式化

在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。

字串格式化

字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:

WritableFont font1 =new WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); ①  WritableCellFormat format1 = new WritableCellFormat(font1); ②  Label label = new Label( 0 , 0 ,”data 4 test”,format1) ③

其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的

构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。

②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种

属性,后面的单元格格式化中会有更多描述。

③处使用了Label类的构造子,指定了字串被赋予那种格式。

在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:

// 把水平对齐方式指定为居中 format1.setAlignment(jxl.format.Alignment.CENTRE); / 把垂直对齐方式指定为居中 format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

五、单元格操作

Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。

1、 合并单元格

WritableSheet.mergeCells( int m, int n, int p, int q); // 作用是从(m,n)到(p,q)的单元格全部合并,比如: WritableSheet sheet = book.createSheet(“第一页”, 0 ); // 合并第一列第一行到第六列第一行的所有单元格 sheet.mergeCells( 0 , 0 , 5 , 0 );

合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。

2、 行高和列宽

WritableSheet.setRowView( int i, int height); // 作用是指定第i+1行的高度,比如: // 将第一行的高度设为200 sheet.setRowView( 0 , 200 ); WritableSheet.setColumnView( int i, int width); // 作用是指定第i+1列的宽度,比如: // 将第一列的宽度设为30 sheet.setColumnView( 0 , 30 );

jExcelAPI还有其他的一些功能,比如插入图片等,这里就不再一一介绍,读者可以自己探索。其中:如果读一个excel,需要知道它有多少行和多少列,如下操作:

Workbook book = Workbook.getWorkbook( new File( " 测试1.xls " )); // 获得第一个工作表对象 Sheet sheet = book.getSheet( 0 ); // 得到第一列第一行的单元格 int columnum = sheet.getColumns(); // 得到列数 int rownum = sheet.getRows(); // 得到行数 System.out.println(columnum); System.out.println(rownum); for ( int i = 0 ; i < rownum; i ++ ) // 循环进行读写 { for ( int j = 0 ; j < columnum; j ++ ) { Cell cell1 = sheet.getCell(j, i); String result = cell1.getContents(); System.out.print(result);

JAVA利用JXL导出/生成 EXCEL1的更多相关文章

  1. JAVA利用JXL导出/生成 EXCEL

    /** * 导出导出采暖市场部收入.成本.利润明细表 * @author JIA-G-Y */ public String exporExcel(String str) { String str=Se ...

  2. java利用JXL导出/生成 EXCEL【my】

    一.创建一个excel文件 package test;// 生成Excel的类 import java.io.File; import jxl.Workbook;import jxl.write.La ...

  3. JAVA利用JXL导出 EXCEL (在原有的excel模板上把数据导到excel上)

    添加依赖 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>j ...

  4. java利用jxl实现Excel导入功能

    本次项目实践基于Spring+SpringMvc+MyBatis框架,简单实现了Excel模板导出.和Excel批量导入的功能.实现过程如下:. 1.maven导入所需jar包 <depende ...

  5. JAVA利用jxl读取Excel内容

    JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. import java.io.File; import java.io.FileInp ...

  6. Java中用JXL导出Excel代码详解

    jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支 ...

  7. 自己写的java用jxl导出到excel工具

    package com; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; i ...

  8. java利用itext导出pdf

    项目中有一功能是导出历史记录,可以导出pdf和excel,这里先说导出pdf.在网上查可以用那些方式导出pdf,用itext比较多广泛. 导出pdf可以使用两种方式,一是可以根据已有的pdf模板,进行 ...

  9. java利用jxl操作Excel

    /** * 把从数据库查询到的数据,写入电子表格 * * @throws Exception */ public void createXls() throws Exception { Dao dao ...

随机推荐

  1. Django 补充知识

    目录 Django基于配置文件的编程思想 初步实现 大佬实现 跨站请求伪造csrf 什么是csrf? 前端如何解决 ajax解决 csrf相关的装饰器 FBV方式装饰器 CVB方式装饰器 Django ...

  2. python下使用ElasticSearch

    一 什么是 ElasticSearch Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elas ...

  3. 莫烦PyTorch学习笔记(三)——激励函数

    1. sigmod函数 函数公式和图表如下图     在sigmod函数中我们可以看到,其输出是在(0,1)这个开区间内,这点很有意思,可以联想到概率,但是严格意义上讲,不要当成概率.sigmod函数 ...

  4. SpringCloud学习笔记(四):Eureka服务注册与发现、构建步骤、集群配置、Eureka与Zookeeper的比较

    简介 Netflix在设计Eureka时遵守的就是AP原则 拓展: 在分布式数据库中的CAP原理 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availab ...

  5. PAT甲级——A1077 Kuchiguse

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  6. DEV 皮肤的使用

    一.皮肤的使用 拖入defaultLookAndFeel 组件到窗体中 拖入ribbonControl 控件到窗体中 将窗体继承为 DevExpress.XtraBars.Ribbon.RibbonF ...

  7. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  8. Postfix+Dovecot+MySQL搭建邮件服务器(续)

    上一篇中的原文中$7$是错的,应该用$6$, 找到: 原因可参考 https://passlib.readthedocs.io/en/stable/lib/passlib.hash.sha512_cr ...

  9. SQL中distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  10. js 设置缓存

    长期存储    localStorage.getItem("key");       //获取键的值    localStorage.setItem("key" ...