三、使用java Excel操作Excel文件
Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。Java Excel的特征:
● 支持Excel 95-2000的所有版本
● 生成Excel 2000标准格式
● 支持字体、数字、日期格式化操作
● 支持对单元格加阴影和加色彩;● 修改存在的工作表;
● 支持图像和图表● 日志记录可以定制
● 更小更快更省内存
应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。在线帮助文档http://jexcelapi.sourceforge.net/resources/javadocs/2_6_10/docs/index.html
在这里我们将通过一些实例,学习掌握读取、新建、更新,其中也包括常见格式的设置:字体、颜色、背景、合并单元格等操作,有这些其实已经基本足够应付大部分问题了。
3.1环境配置
3.1.1下载
下载地址 http://www.andykhan.com/jexcelapi/
3.1.2 加入jar包
将jxl.jar拷贝到项目的Lib下
3.2 使用Java Excel Api 导出 Excel文件
下面我们在看如何使用Java Excel实现导出Excel表格?
代码如下:(实际开发中应封装到业务层组件中,然后在控制层中调用。这里直接写在控制层组件,如Servlet的doGet/doPost方法或Struts框架的execute方法中)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
|
3.3高级操作
3.3.1数据格式化
在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用即可。
数据的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由 WritableFont和WritableCellFormat类来负责。例如:
① WritableFont font=new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD );
② WritableCellFormat format1=new WritableCellFormat(font);
③ Label label=new Label(0,0,”data 4 test”,format1);
其中
I.指定了字串格式:字体为宋体,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。
II. 处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,如上例代码所示。
III. 处使用了Label类的构造子,指定了显示的位置,文本内容,字串被赋予的格式。
与Label类似的Number、DateTime,区别Label表示文本数据;Number表示数值数据,可使NumberFormat格式化数据;用DateTime表示日期型数据,可应用DateFormat格式化数据。
3.3.2单元格操作
Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。
1、 合并单元格
| 1 2 3 4 5 6 7 8 9 10 11 |
|
2、 行高和列宽
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
3.4 从Excel文件读取数据表
我们就以导入3.2所产生的excel表为例,掌握如何编写导入Excel代码(该代码封装在业务层方法)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
3.4 更新已存在的Excel文件
将3.2所产生的excel表(temp.xls)的第一条记录(excel文件的指第三行)的班级名称改为As179,代码如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
对于更新已存在的Excel文件实际上就是获取已有工作薄对象(但是只读的),然后将获取的只读的工作薄对象转化为可写入的Excel工作薄对象(WritableWorkbook ),其他部分就是通过可写入WritableSheet 对象和可写入WritableCell 对象进行编辑。
例:
@RequestMapping(value = "/exp.htm")
public JSON exp(HttpServletRequest request, HttpServletResponse response) throws Exception {
try {
SessionUser sessionUser = this.getUser(request);
String loginName = sessionUser.getLoginName();
String kpiName = request.getParameter("kpiName");
String department = request.getParameter("department");
String name = request.getParameter("names");
String taskStatus = request.getParameter("taskStatus");
String flowStatus = request.getParameter("flowStatus");
String yearNumber = request.getParameter("yearNumber");
String monthStart = request.getParameter("monthStart");
String monthEnd = request.getParameter("monthEnd");
HashMap map = new HashMap();
//判断是否是管理员
map.put("isadmin", this.kpiSonService.isAdmin(sessionUser) + "");
map.put("loginName", loginName);
map.put("kpiName", kpiName);
map.put("department", department);
map.put("name", name);
map.put("taskStatus", taskStatus);
map.put("flowStatus", flowStatus);
map.put("yearNumber", yearNumber);
map.put("monthStart", monthStart);
map.put("monthEnd", monthEnd);
List<KpiView> list = kpiSonService.expEle(map);
// 表头
String[] outColName = {"序号","板块","部门","月份","编号","KPI名称","上年期末值","T1","T2","T3","上月实际值","上月工作说明","上月工作计划","本月实际值","本月工作说明","下月工作计划"};
String[] outCol = {"numbers","plate","department","month","code","kpiName","finalValue","t1","t2","t3","lastValue","lastInstructions","lastPlan","actualValue","workInstructions","plan"};
// 获得该类的所有属性的长度
Field[] colName = new Field[outCol.length];
for (Object obj : list) {
for (int i =0; i < outCol.length; i++) {
colName[i] = obj.getClass().getDeclaredField(outCol[i]);
}
}
// 创建一个excel文档
WritableWorkbook book = Workbook.createWorkbook(response.getOutputStream());
// 设置响应方式
response.setContentType("application/vnd.ms-excel;charset=utf-8");
Calendar ca = Calendar.getInstance();
String names = null;
names = URLEncoder.encode(
"战略KPI" + ca.get(Calendar.YEAR) + "-" + (ca.get(Calendar.MONTH) + 1) + "-"
+ ca.get(Calendar.DATE) + ".xls", "UTF-8");
response.addHeader("Content-Disposition",
"attachment;filename=" + names + ";"
+ "filename*=UTF-8''" + names);
// 创建sheet工作表
WritableSheet sheet = book.createSheet("战略KPI", 0);
// 创建字体对象
WritableFont font = new WritableFont(WritableFont.createFont("宋体"), 15);
//标题
WritableCellFormat titleFormat = new WritableCellFormat();
titleFormat.setAlignment(Alignment.CENTRE);
titleFormat.setFont(font);
// 创建表头数据行格式化对象
WritableCellFormat format = new WritableCellFormat();
// 设置字体
format.setFont(font);
// 设置居中
format.setAlignment(Alignment.CENTRE);
//设置表头背景色
format.setBackground(Colour.GRAY_25);
// 设置自动换行
format.setWrap(true);
format.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN);
for (int i = 0; i < outColName.length; i++) {
Label lab = new Label(i, 0, outColName[i]);
lab.setCellFormat(format);
sheet.setColumnView(i, 30);
// 添加表头
sheet.addCell(lab);
}
// 添加表格体
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < colName.length; j++) {
colName[j].setAccessible(true);
String s = "";
s = colName[j].get(list.get(i)) != null ? colName[j].get(list.get(i)) + "" : "";
sheet.addCell(new Label(j, i + 1, s));
}
}
book.write();
book.close();
return ResultData.successToJson("导出成功!");
} catch (Exception e) {
e.printStackTrace();
}
return ResultData.failureToJson("导出失败!");
}
本文详细介绍JavaExcel API的使用,涵盖环境配置、读写Excel文件、格式化数据、单元格操作及更新现有文件的方法。适合Java开发者快速掌握Excel文件处理技巧。
3787

被折叠的 条评论
为什么被折叠?



