数据的导入导出

一、供应商或客户数据导出

1、需求分析

点击导出按钮,将供应商或客户的信息导出为excel文档

2、POI介绍

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。
用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)

结构:
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。

3、添加POI依赖,在erp_partent下的pom.xml当中

4、在erp_biz下的ISupplierBiz当中

5、修改erp_entity下的Supplier

6、在erp_biz下的ISupplierBiz的实现类SupplierBiz

package com.itzheng.erp.biz.impl;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;import com.itzheng.erp.biz.ISupplierBiz;
import com.itzheng.erp.dao.ISupplierDao;
import com.itzheng.erp.entity.Supplier;
/*** 供应商业务逻辑类* @author Administrator**/
public class SupplierBiz extends BaseBiz<Supplier> implements ISupplierBiz {private ISupplierDao supplierDao;public void setSupplierDao(ISupplierDao supplierDao) {this.supplierDao = supplierDao;setBaseDao(supplierDao);}/*** 导出数据*/public void export(OutputStream os, Supplier t1) {//获取要导出的数据列表List<Supplier> list = supplierDao.getList(t1, null, null);//创建一个工作簿HSSFWorkbook wb = new HSSFWorkbook();String sheetName = "";if(Supplier.TYPE_CUSTOMER.equals(t1.getType())){sheetName = "客户";}if(Supplier.TYPE_SUPPLIER.equals(t1.getType())){sheetName = "供应商";}//创建一个工作表HSSFSheet sheet = wb.createSheet(sheetName);//创建一行,行的索引是从0开始, 写标题HSSFRow row = sheet.createRow(0);String[] header = {"名称","地址","联系人","电话","Email"};int[] width = {5000,8000,4000,8000,10000};HSSFCell cell = null;for(int i = 0; i < header.length; i++){cell = row.createCell(i);cell.setCellValue(header[i]);//设置列宽sheet.setColumnWidth(i, width[i]);}//导出的内容int rowCount = 1;for(Supplier supplier : list){row = sheet.createRow(rowCount);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());//EmailrowCount++;}try {wb.write(os);} catch (IOException e) {e.printStackTrace();} finally{try {wb.close();} catch (IOException e) {e.printStackTrace();}}}
}

7、 在erp_web下的SupplierAction当中

/*** 导出数据*/public void export(){String filename = "";if(Supplier.TYPE_SUPPLIER.equals(getT1().getType())){filename = "供应商";}if(Supplier.TYPE_CUSTOMER.equals(getT1().getType())){filename = "客户";}filename += ".xls";//响应对象HttpServletResponse response = ServletActionContext.getResponse();try {//设置输出流,实现下载文件response.setHeader("Content-Disposition", "attachment;filename=" +new String(filename.getBytes(),"ISO-8859-1"));supplierBiz.export(response.getOutputStream(), getT1());} catch (IOException e) {e.printStackTrace();}}

8、设置列宽

9、前端的实现

1)创建download.js

在erp_web下的src当中的webapp/ui当中创建download.js

// Ajax 文件下载
$.download = function(url, data){    // 获得url和datavar inputs = '';    $.each(data, function(name, value) {          inputs+='<input type="hidden" name="'+ name +'" value="'+ value +'" />'; }); $('<form action="'+ url +'" method="post">'+inputs+'</form>').appendTo('body').submit().remove();
};
2)在erp_web下的src当中的webapp/ui当中supplier.html当中引入download.js

3)修改crud.js

二、导出订单

1、导出订单后端biz

(1)在erp_biz下的IOrdersBiz当中

(2)IOrdersBiz的实现类当中OrdersBiz

@Overridepublic void export(OutputStream os, Long uuid) {// 创建一个工作簿HSSFWorkbook wb = new HSSFWorkbook();// 获取订单Orders orders = ordersDao.get(uuid);List<Orderdetail> detaillist = orders.getOrderDetails();// 创建工作表String sheetName = "";if (Orders.TYPE_IN.equals(orders.getType())) {sheetName = "采购单";}if (Orders.TYPE_OUT.equals(orders.getType())) {sheetName = "销售单";}HSSFSheet sheet = wb.createSheet(sheetName);// 创建一行,行的索引是从0开始HSSFRow row = sheet.createRow(0);// 创建单元格,列的索引是从0 开始HSSFCell cell = row.createCell(0);// 创建单元格样式HSSFCellStyle style_content = wb.createCellStyle();style_content.setBorderBottom(BorderStyle.THIN);// 下边框style_content.setBorderTop(BorderStyle.THIN);// 上边框style_content.setBorderLeft(BorderStyle.THIN);// 左边框style_content.setBorderRight(BorderStyle.THIN);// 右边框// 设置水平对其方式为居中style_content.setAlignment(HorizontalAlignment.CENTER);// 设置垂直对其方式为居中style_content.setVerticalAlignment(VerticalAlignment.CENTER);// 设置日期格式HSSFCellStyle style_date = wb.createCellStyle();// 把style_context里面样式复制到style_datestyle_date.cloneStyleFrom(style_content);DataFormat df = wb.createDataFormat();style_date.setDataFormat(df.getFormat("yyyy-MM-dd HH:mm:ss"));// 设置标题的样式HSSFCellStyle style_title = wb.createCellStyle();style_title.setAlignment(HorizontalAlignment.CENTER);style_title.setVerticalAlignment(VerticalAlignment.CENTER);HSSFFont style_font = wb.createFont();style_font.setFontName("黑体");style_font.setFontHeightInPoints((short) 18);// 加粗style_font.setBold(true);style_title.setFont(style_font);// 创建内容样式的字体HSSFFont font_content = wb.createFont();// 设置字体名称,相当于选中了那种字符font_content.setFontName("宋体");// 设置字体的大小font_content.setFontHeightInPoints((short) 11);style_content.setFont(font_content);// 合并单元格// 合并:标题sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));// 合并第二行sheet.addMergedRegion(new CellRangeAddress(2, 2, 1, 3));// 合并第7行sheet.addMergedRegion(new CellRangeAddress(7, 7, 0, 3));// 创建11行,4列// 创建矩阵11行,4列int rowCount = detaillist.size() + 9;// 创建单元格的数量是数据的长度+9for (int i = 2; i <= rowCount; i++) {row = sheet.createRow(i);for (int j = 0; j < 4; j++) {// 给单元格设置样式row.createCell(j).setCellStyle(style_content);}}// 必须先有创建的行和单元格,才可以使用// 创建标题单元格HSSFCell titleCell = sheet.createRow(0).createCell(0);titleCell.setCellValue(sheetName);// 设置标题样式titleCell.setCellStyle(style_title);sheet.getRow(2).getCell(0).setCellValue("供应商");sheet.getRow(3).getCell(0).setCellValue("下单日期");sheet.getRow(4).getCell(0).setCellValue("审核日期");sheet.getRow(5).getCell(0).setCellValue("采购日期");sheet.getRow(6).getCell(0).setCellValue("入库日期 ");sheet.getRow(3).getCell(2).setCellValue("经办人");sheet.getRow(4).getCell(2).setCellValue("经办人");sheet.getRow(5).getCell(2).setCellValue("经办人");sheet.getRow(6).getCell(2).setCellValue("经办人");sheet.getRow(7).getCell(0).setCellValue("订单明细");sheet.getRow(8).getCell(0).setCellValue("商品名称");sheet.getRow(8).getCell(1).setCellValue("商品数量");sheet.getRow(8).getCell(2).setCellValue("商品价格");sheet.getRow(8).getCell(3).setCellValue("金额");// 设置行高于列宽// 标题行高sheet.getRow(0).setHeight((short) 1000);// 内容体的行高for (int i = 2; i <= rowCount; i++) {sheet.getRow(i).setHeight((short) 500);}// 设置列宽for (int i = 0; i < 4; i++) {sheet.setColumnWidth(i, (short) 5000);}// 订单详情,设置日期与经办人// 设置单元格样式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);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());}// 缓存员工编号的名称,key=员工编号,value=员工名称Map<Long, String> empNameMap = new HashMap<Long, String>();// 设置经办人sheet.getRow(3).getCell(3).setCellValue(getEmpName(orders.getCreater(), empNameMap, empDao));sheet.getRow(4).getCell(3).setCellValue(getEmpName(orders.getStarter(), empNameMap, empDao));sheet.getRow(5).getCell(3).setCellValue(getEmpName(orders.getStarter(), empNameMap, empDao));sheet.getRow(6).getCell(3).setCellValue(getEmpName(orders.getEnder(), empNameMap, empDao));// 缓存供应商编号与员工的名称,key=供应商的编号,value=供应商的名称Map<Long, String> supplierNameMap = new HashMap<Long, String>();// 设置供应商sheet.getRow(2).getCell(1).setCellValue(getSupplierName(orders.getSupplieruuid(), supplierNameMap));// 将数据库当中的数据填充(设置明细内容)int index = 0;Orderdetail od = null;for (int i = 9; i < rowCount; i++) {od = detaillist.get(index);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());index++;}sheet.getRow(rowCount).getCell(0).setCellValue("合计");// 设置合计sheet.getRow(rowCount).getCell(3).setCellValue("" + orders.getTotalmoney());// 写到输出流当中try {wb.write(os);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {wb.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

2、导出订单后端OrdersAction当中

3、导出订单前端实现

(1)在orders.html当中引入download.js

(2)修改orders.js

//添加审核按钮var toolbar = new Array();toolbar.push({text:'导出',iconCls:'icon-excel',handler:doExport})if(Request['oper'] == 'doCheck' ){toolbar.push({toolbar:[{text:'审核',iconCls:'icon-search',handler:doCheck}]});}//添加确认按钮if(Request['oper'] == 'doStart' ){toolbar.push({toolbar:[{text:'确认',iconCls:'icon-search',handler:doStart}]});}$('#ordersDlg').dialog({toolbar:toolbar});

function doExport(){$.download("orders_export",{"id":$('#uuid').html()});
}

三、导入订单(应商或客户数据导入)

我们需要将批量的供应商(客户)信息导入到系统里,因此我们需要实现导入功能
如下图:点击导入按钮

弹出导入数据对话框:

选择excel文件后点击“导入”按钮,把数据导入到系统中,成功后刷新表格并关闭“导入数据”窗口

1、修改SupplierDao

2、后端代码实现,在erp_biz下的ISupplier和Supplier

(1)ISupplier

(2)SupplierBiz当中

@Overridepublic void doImport(InputStream is) throws IOException {HSSFWorkbook wb = null;try {wb = new HSSFWorkbook(is);HSSFSheet sheet = wb.getSheetAt(0);String type = "";if("供应商".equals(sheet.getSheetName())) {type = Supplier.TYPE_SUPPLIER;}else  if("客户".equals(sheet.getSheetName())) {type = Supplier.TYPE_CUSTOMER;}else {throw  new ErpException("工作表名称不正确");}//读取数据int lastRow = sheet.getLastRowNum();//获取最后一行的行号Supplier supplier = null;for (int i = 1; i <= lastRow; i++) {supplier = new Supplier();supplier.setName(sheet.getRow(i).getCell(0).getStringCellValue());//设置供应商名称//判断是否已经存在,通过名称来判断List<Supplier> list = supplierDao.getList(null, supplier, null);if(list.size() > 0) {supplier = list.get(0);}supplier.setAddress(sheet.getRow(i).getCell(1).getStringCellValue());//设置地址supplier.setContact(sheet.getRow(i).getCell(2).getStringCellValue());//联系人supplier.setTele(sheet.getRow(i).getCell(3).getStringCellValue());//联系电话supplier.setEmail(sheet.getRow(i).getCell(4).getStringCellValue());//邮箱if(list.size()==0) {supplier.setType(type);//新增supplierDao.add(supplier);}}} finally {if(null != wb) {try {wb.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

3、SupplierAction当中

/** 导入数据*/public void doImport() {//文件类型判断if(!"application/vnd.ms-excel".equals(fileContentType)){write(ajaxReturn(false, "上传文件必须是excel文件"));return;}try {supplierBiz.doImport(new FileInputStream(file));write(ajaxReturn(true, "上传文件成功"));} catch (ErpException e) {write(ajaxReturn(false, e.getMessage()));} catch (IOException e) {write(ajaxReturn(false, "上传文件失败"));e.printStackTrace();}}

4、供应商或客户的导入——前端

(1)修改supplier.html

(2)修改crud.js

},'-',{text: '导入',iconCls: 'icon-save',handler: function(){$('#importDlg').dialog('open');}}]

//判断是否有导入的功能var importForm = document.getElementById("importForm");if(importForm){//添加的窗口$('#importDlg').dialog({title:'导入数据',width:330,height:160,modal:true,closed:true,buttons:[{text: '导入',handler:function(){$.ajax({url: name + '_doImport',data:new FormData($('#importForm')[0]),type:'post',processData:false,contentType:false,dataType:'json',success:function(rtn){$.messager.alert('提示',rtn.message,'info',function(){if(rtn.success){$('#importDlg').dialog('close');$('#importForm').form('clear');$('#grid').datagrid('reload');}});}});}}]});}
(3)测试导入数据

http://localhost:8080/erp/supplier.html?type=2



Java全栈开发---Java ERP系统开发:商业ERP(十二)数据的导入导出(Excel)相关推荐

  1. 【Java全栈】Java全栈学习路线及项目全资料总结【JavaSE+Web基础+大前端进阶+SSM+微服务+Linux+JavaEE】

    目录 jdk api 1.8中文版 jdk api 1.8_google.CHM 零:Java 全栈知识体系 第一阶段:JavaSE 一,程序应用(★★) 二,面向对象程序设计基础(★★★) 面向对象 ...

  2. 基于云开发模式的评分小程序总结!二维码、导出excel表格等实用干货!

    基于云开发的打分小程序开发总结 1.TAKE打分小程序 1.1.项目简介 1.1.1.开发背景 1.1.2.项目介绍 1.2.项目效果图 1.2.1.主页 1.2.2.评分流程页 1.2.3.项目详情 ...

  3. Java全栈体系路线(总结不易,持续更新中)

    文章目录 Java全栈工程师 <font color=orange>Java基础 基础语法 面向对象 工具类 集合框架 序列化 反射机制 注解 文件处理 设计模式 视频教程 文档教程 练习 ...

  4. Java全栈(二)JavaSE:25.File类和IO流

    1 java.io.File类 1.1 概述 File类是java.io包下代表与平台无关的文件和目录,也就是说如果希望在程序中操作文件和目录都可以通过File类来完成,File类能新建.删除.重命名 ...

  5. java全栈前景_Java全栈开发哪个发展前景好

    原标题:Java全栈开发哪个发展前景好 全栈和java哪个能更好迎合市场需求,有同学咨询学习哪个在以后前景和工作薪水上能更吃香,首先我们先来了解下Java开发和全栈开发的区别. 全栈开发工程师是指掌握 ...

  6. python全栈和java全栈_Java和全栈开发哪个发展前景好

    展开全部 全栈和java哪个能更好62616964757a686964616fe58685e5aeb931333365633839迎合市场需求,有同学咨询学习哪个在以后前景和工作薪水上能更吃香,首先我 ...

  7. Java Web 后台中餐饮业报表系统开发实例

    本期葡萄城公开课,我们诚邀石家庄品智技术有限公司,高级软件工程师--刘永政先生,为大家在线分享餐饮业报表系统设计模式,以及在 HTML5 报表浏览器.Java 架构中跨平台使用ActiveReport ...

  8. 计算机毕业设计Java宁夏中卫城市风采在线系统开发(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java宁夏中卫城市风采在线系统开发(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java宁夏中卫城市风采在线系统开发(源码+系统+mysql数据库+lw文档) 本源码技术栈 ...

  9. java 前端工作内容_java前端、java后端、java全栈工作主要内容是什么?哪个薪资高?...

    摘要 最近,听了一场关于java全栈工程师职位的简介说明,里面很清楚的说明了一下前端,后端,全栈都是做什么工作的.其实,想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效.我知道一些刚刚入行 ...

  10. Java全栈学习路线-拭去心尘

    一.JavaSE(熟练使用IDEA(私下学习可以,但进公司做项目不要使用破解版)和Eclipse) 辅助语言:C++(面向对象语言,偏向底层,语法和Java类似,我个人偏好C++为辅助语言)+pyth ...

最新文章

  1. win服务器系统程序原因
  2. Linux下文件的三个时间:ctime、mtime、atime的区别
  3. js基于lodash实现前端防抖与节流
  4. React Native ScrollableTabView的自定义tabBar
  5. day24 01 初识继承
  6. 自行车房车,还是第一次看到,惊倒一片!
  7. Java原生网络编程
  8. Express中间件
  9. 解决import cv2找不到指定模块问题
  10. 微电子新手入门之 Origin画图
  11. access 和SQL有什么不同
  12. 国产麒麟系统PXE安装-UEFI引导
  13. codeforces1395D 贪心
  14. spark hint中Broadcast Hints、COALESCE and REPARTITION Hints
  15. 不积硅步,无以至千里
  16. 通过钉钉网页上的js学习xss打cookie
  17. rtx 加密机制_RTX发送消息提醒实现以及注意事项
  18. Jenkins 如何构建一个项目
  19. 在Kali中 利用工具Fluxion渗透wpa/wpa2加密WiFi 详细步骤(小白适用) 2020.1
  20. Appium基础篇10-元素定位之by_accessibility_id

热门文章

  1. mybatis@Param的作用
  2. WIN10重置网络后网络适配器不见了并且适配器驱动感叹号
  3. 彩扩机项目--两个状态指示灯,巧妙的使用二极管的特性,以及物理按键的滤波...
  4. 古诗词学习-迢迢牵牛星+长歌行+小雅·采薇+敕勒歌+悯农(其一)+小儿垂钓+蝉+正月十五夜+望月怀远+十五夜望月寄杜郎中
  5. 如何提高人际交往的沟通技巧
  6. 深度学习的坎坷六十年:从感知机到Transformer...
  7. 【lzy学习笔记-dive into deep learning】数学预备 2.1-2.4
  8. linux dd从磁盘读取文件命令
  9. js中获取阳历,阴历日期节日自动更换背景
  10. 【笔记】win10打开注册表的三种方式