所用到的技术 : Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。
用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MS PowerPoint文件。Apache POI 提供Java操作Excel解决方案。
入门案例:思路:1.导入依赖 2.测试
1.导入所需要的依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
2.建立一个Excel表格 进行测试
public static void main(String[] args) throws FileNotFoundException, IOException {
// 创建excel
HSSFWorkbook wk = new HSSFWorkbook();
// 创建一张工作表
HSSFSheet sheet = wk.createSheet();
// 设置列宽
sheet.setColumnWidth(0, 5000);
// 创建第一行
HSSFRow row = sheet.createRow(0);
// 创建第一行的第一个单元格
HSSFCell cell = row.createCell(0);
// 想单元格写值
cell.setCellValue("测试");
// 保存到本地
wk.write(new FileOutputStream(new File("D://ERP/a.xls")));
// 关闭工作薄
wk.close();
}
结合项目:思路:1.导入依赖 2.service 层 3.Action 层 4.Web 层
1.导入项目依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
2.service 层
思路:
- 创建工作表格实体类
- 给表格一个名字
- 工作表格的创建
- 创建行,创建每个单元格
- 给每个单元格填数据
- 关流
/**
* 导出供应商的数据
*/
@Override
public void export(OutputStream os, Supplier t1) {
//查出符合条件的所供应/客户的列表(数据库查找数据)
List<Supplier> supplierList = supplierDao.getList(t1, null, null);
//创建工作薄实体类
Workbook wk = new HSSFWorkbook();
//给工作表一个名字
String sheetName = "";
if(Supplier.TYPE_SUPPLIER.equals(t1.getType())){
sheetName = "供应商";
}
if(Supplier.TYPE_CUSTOMER.equals(t1.getType())){
sheetName = "客户";
}
//创建工作表实体类
Sheet sheet = wk.createSheet(sheetName);
//创建一行,参数指的是: 行的索引=行号-1
Row row = sheet.createRow(0);
//列名,表头
String[] headers = {"名称","地址","联系人","电话","Email"};
/*String[] methodname = {"getName","getAddress",
"getContact","getTele","getEmail"};*/
/*Method[] methods = Supplier.class.getMethods();
Map<String, Method> methodNameMap = new HashMap<String,Method>();
for(Method m : methods){
methodNameMap.put(m.getName(), m);
}*/
for(int i = 0; i < headers.length; i++){
row.createCell(i).setCellValue(headers[i]);
}
//创建单元格, 参数指的是:列的索引,从0开始
//输出每一条记录
if(null != supplierList && supplierList.size() > 0){
Supplier supplier = null;
for(int i = 1; i<=supplierList.size(); i++){
row = sheet.createRow(i);
supplier = supplierList.get(i-1);
/*for(String mname : methodname){
Method m = methodNameMap.get(mname);
try {
Object obj = m.invoke(supplier, new Object[]{});
Class<?> returnType = m.getReturnType();
//returnType.cast(obj);
row.createCell(0).setCellValue(returnType.cast(obj));//名称
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
row.createCell(0).setCellValue(supplier.getName());//名称
row.createCell(1).setCellValue(supplier.getAddress());//地址
row.createCell(2).setCellValue(supplier.getContact());//联系
row.createCell(3).setCellValue(supplier.getTele());//电话
row.createCell(4).setCellValue(supplier.getEmail());//Email
}
}
//输出到输出流中
try {
wk.write(os);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
wk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.action层
思路:
1.给下载的文件名字的判断
2.设置下载的响应头
/**
* 导出
*/
public void export(){
try {
String filename = "";
if(Supplier.TYPE_SUPPLIER.equals(getT1().getType())){
filename = "供应商.xls";
}
if(Supplier.TYPE_CUSTOMER.equals(getT1().getType())){
filename = "客户.xls";
}
HttpServletResponse res = ServletActionContext.getResponse();
res.setHeader("Content-Disposition", "attachment;filename=" +
new String(filename.getBytes(),"ISO-8859-1"));
supplierBiz.export(ServletActionContext.getResponse().getOutputStream(),getT1());
} catch (IOException e) {
e.printStackTrace();
}
}
4.wed 层
思路:
- 页面导出js
- js在抽取的crud中添加导出按钮
<script type="text/javascript" src="ui/download.js"></script>
'-',{
text: '导出',
iconCls: 'icon-excel',
handler: function(){
//查询条件
var searchData = $('#searchForm').serializeJSON();
//请求下载文件
$.download("supplier_export?t1.type=" + Request['type'], searchData);
}
},
导出加强
思路:
- 添加依赖
- service层创建创建表格和处理数据
- action层
- web层
1.添加依赖 (如上)
2.service层创建创建表格和处理数据
思路:1.创建表格 2.sheet名字 3.数据样式 4.行数 5.数据处理6.关流
/**
* 导出订单
*/
@Override
public void exportById(OutputStream os, Long uuid) {
//根据订单编号获取订单
Orders orders = ordersDao.get(uuid);
//订单明细
List<Orderdetail> orderDetails = orders.getOrderDetails();
String sheetName = "";
if(Orders.TYPE_IN.equals(orders.getType())){
sheetName = "采 购 单";
}
if(Orders.TYPE_OUT.equals(orders.getType())){
sheetName = "销 售 单";
}
//工作簿
HSSFWorkbook wk = new HSSFWorkbook();
//创建工作表
Sheet sheet = wk.createSheet(sheetName);
//创建字体
HSSFFont font_content = wk.createFont();
font_content.setFontName("宋体");
font_content.setFontHeightInPoints((short)12);
//创建样式
CellStyle style_content = wk.createCellStyle();
//水平居中
style_content.setAlignment(HorizontalAlignment.CENTER);
//重直居中
style_content.setVerticalAlignment(VerticalAlignment.CENTER);
//设置字体
style_content.setFont(font_content);
//标题的样式, 样式克隆
CellStyle style_title = wk.createCellStyle();
style_title.cloneStyleFrom(style_content);
HSSFFont font_title = wk.createFont();
font_title.setFontName("黑体");
font_title.setFontHeightInPoints((short)20);
style_title.setFont(font_title);
//设置边框
style_content.setBorderBottom(BorderStyle.THIN);
style_content.setBorderLeft(BorderStyle.THIN);
style_content.setBorderRight(BorderStyle.THIN);
style_content.setBorderTop(BorderStyle.THIN);
//日期样式
HSSFCellStyle style_date = wk.createCellStyle();
style_date.cloneStyleFrom(style_content);
HSSFDataFormat dataFormat = wk.createDataFormat();
style_date.setDataFormat(dataFormat.getFormat("yyyy-MM-dd hh:mm"));
//创建一行,参数指的是: 行的索引=行号-1
Row row = null;
Cell cell = null;
int rowCnt = 10 + orderDetails.size();
for(int i = 2; i < rowCnt; i++){
row = sheet.createRow(i);
for(int j = 0; j < 4; j++){
cell = row.createCell(j);
//设置单元格样式
cell.setCellStyle(style_content);
}
}
//设置日期格式
sheet.getRow(3).getCell(1).setCellStyle(style_date);
sheet.getRow(4).getCell(1).setCellStyle(style_date);
sheet.getRow(5).getCell(1).setCellStyle(style_date);
sheet.getRow(6).getCell(1).setCellStyle(style_date);
//sheet.getRow(3).getCell(1).setCellValue(new Date());
//合并单元格,订单名称
sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
//供应商名称
sheet.addMergedRegion(new CellRangeAddress(2,2,1,3));
//明细
sheet.addMergedRegion(new CellRangeAddress(7,7,0,3));
//设置header内容
Cell title_cell = sheet.createRow(0).createCell(0);
title_cell.setCellStyle(style_title);
title_cell.setCellValue("采 购 单");
sheet.getRow(2).getCell(0).setCellValue("供应商");
//日期 与 人
row = sheet.getRow(3);
row.getCell(0).setCellValue("下单日期");
row.getCell(2).setCellValue("经办人");
row = sheet.getRow(4);
row.getCell(0).setCellValue("审核日期");
row.getCell(2).setCellValue("经办人");
row = sheet.getRow(5);
row.getCell(0).setCellValue("采购日期");
row.getCell(2).setCellValue("经办人");
row = sheet.getRow(6);
row.getCell(0).setCellValue("入库日期");
row.getCell(2).setCellValue("经办人");
sheet.getRow(7).getCell(0).setCellValue("订单明细");
row = sheet.getRow(8);
row.getCell(0).setCellValue("商品名称");
row.getCell(1).setCellValue("数量");
row.getCell(2).setCellValue("价格");
row.getCell(3).setCellValue("金额");
//设置行高与列宽
//调整行的高度
sheet.getRow(0).setHeight((short)1000);
for(int i = 2; i < rowCnt; i++){
sheet.getRow(i).setHeight((short)500);
}
//调整列宽
for(int i = 0; i < 4; i++){
sheet.setColumnWidth(i, 5000);
}
//写入订单详情
sheet.getRow(2).getCell(1).setCellValue(supplierDao.getName(orders.getSupplieruuid()));
if(null != orders.getCreatetime()){//下单日期
sheet.getRow(3).getCell(1).setCellValue(orders.getCreatetime());
}
if(null != orders.getChecktime()){//审核日期
sheet.getRow(4).getCell(1).setCellValue(orders.getChecktime());
}
if(null != orders.getStarttime()){//采购日期
sheet.getRow(5).getCell(1).setCellValue(orders.getStarttime());
}
if(null != orders.getEndtime()){//入库日期
sheet.getRow(6).getCell(1).setCellValue(orders.getEndtime());
}
//经办人
sheet.getRow(3).getCell(3).setCellValue(empDao.getName(orders.getCreater()));
sheet.getRow(4).getCell(3).setCellValue(empDao.getName(orders.getChecker()));
sheet.getRow(5).getCell(3).setCellValue(empDao.getName(orders.getStarter()));
sheet.getRow(6).getCell(3).setCellValue(empDao.getName(orders.getEnder()));
//写入明细内容
Orderdetail od = null;
//rowCnt = 10+size - 9 = 1+size - 1=size
for(int i = 9; i < rowCnt - 1; i++){
od = orderDetails.get(i-9);
row = sheet.getRow(i);
row.getCell(0).setCellValue(od.getGoodsname());
row.getCell(1).setCellValue(od.getNum());
row.getCell(2).setCellValue(od.getPrice());
row.getCell(3).setCellValue(od.getMoney());
}
//合计
sheet.getRow(rowCnt - 1).getCell(0).setCellValue("合计");
sheet.getRow(rowCnt - 1).getCell(3).setCellValue(orders.getTotalmoney());
//输出到输出流中
try {
wk.write(os);
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
wk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.action层
思路: 1.导出名字的设置,响应头 //2.service调用
/**
* 导出订单
*/
public void exportById(){
try {
String filename = String.format("orders_%d.xls", getId());//"orders_" + getId() + ".xls";
HttpServletResponse res = ServletActionContext.getResponse();
res.setHeader("Content-Disposition", "attachment;filename=" +
new String(filename.getBytes(),"ISO-8859-1"));
ordersBiz.exportById(ServletActionContext.getResponse().getOutputStream(),getId());
} catch (IOException e) {
e.printStackTrace();
}
}
4.web层
思路: 1.在html 页面导入js 2.在 orders.js中(弹出的dialog中要有导出) 添加导出后按钮
<script type="text/javascript" src="ui/download.js"></script>
var ordersDlgToolbar = new Array();
//添加审核的按钮
if(Request['oper'] == 'doCheck'){
ordersDlgToolbar.push({text:'审核',iconCls:'icon-search',handler:doCheck});
}
//添加确认的按钮
if(Request['oper'] == 'doStart'){
ordersDlgToolbar.push({text:'确认',iconCls:'icon-search',handler:doStart});
}
//导出
ordersDlgToolbar.push({text:'导出',iconCls:'icon-excel',handler:function(){
$.download("orders_exportById", {id:$('#uuid').html()});
}});
//如果有按钮,就把加到窗口里去
if(ordersDlgToolbar.length > 0){
$('#ordersDlg').dialog({
toolbar:ordersDlgToolbar
});
}