蓝云ERP系统项目笔记——数据的导入与导出(10)

2023-11-23 11:50

本文主要是介绍蓝云ERP系统项目笔记——数据的导入与导出(10),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

1.1、需求分析

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

下载到本地,打开导出的excel文件

 

1.2、POI简介

Apache POI 是用Java编写的免费开源的跨平台的 Java APIApache POI提供APIJava程式对Microsoft Office格式档案读和写的功能。POI“Poor Obfuscation Implementation”的首字母缩写,意为可怜的模糊实现

用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS WordMSPowerPoint文件。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格式档案的功能。

 1.3、入门小Demo

(1)创建工程引入POI

 创建POIDemo工程

引入POI依赖

 

(2)向单元格写值

创建POIDemo类,代码如下

 

注:行和列的索引都是从0开始的,即0行表示实际上的第1行,0列表示第一列(A列)

(3)设置列宽度

在上例中加入

 

结果:

 

1.4、后端代码编写

(1)添加POI依赖

在父工程的pom.xml中添加POI的依赖

 

(2)业务逻辑层实现

在ISupplierBiz中添加方法:

 

 在SupplierBiz中添加方法的实现:

 

/*** 导出到excel文件* @param os 输出流* @param t1 查询条件*/
public void export(OutputStream os, Supplier t1){// 根据查询条件获取供应商/客户列表List<Supplier> supplierList = super.getList(t1, null, null);// 创建excel工作簿HSSFWorkbook wk = new HSSFWorkbook();HSSFSheet sheet = null;// 根据查询条件中的类型来创建相应名称的工作表if("1".equals(t1.getType())){sheet = wk.createSheet("供应商");}if("2".equals(t1.getType())){sheet = wk.createSheet("客户");}// 写入表头HSSFRow row = sheet.createRow(0);// 定义好每一列的标题String[] headerNames = {"名称","地址","联系人","电话","Email"};// 指定每一列的宽度int[] columnWidths = {4000,8000,2000,3000,8000};HSSFCell cell = null;for(int i = 0; i < headerNames.length; i++){cell = row.createCell(i);cell.setCellValue(headerNames[i]);sheet.setColumnWidth(i, columnWidths[i]);}// 写入内容int i = 1;for(Supplier supplier : supplierList){row = sheet.createRow(i);//必须按照hderarNames的顺序来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());//邮件地址i++;}try {// 写入到输出流中wk.write(os);} catch (IOException e) {e.printStackTrace();}finally{try {// 关闭工作簿wk.close();} catch (IOException e) {e.printStackTrace();}}
}

(3)Action层实现

修改SupplierAction,添加export方法:

/*** 导出excel文件*/
public void export(){String filename = "";// 根据类型生成文件名if("1".equals(getT1().getType())){filename = "供应商.xls";}if("2".equals(getT1().getType())){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 (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();
}
}

1.5、页面代码

(1)引入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)添加导出按钮

在crud.js中的grid的工具栏中添加按钮,代码如下

 

2、采购销售订单导出

2 .1、需求分析

2.2、POI样式设置

我们可以在示例工程中来完成这些导出的采购订单的模板,将来用到ERP系统里时,可直接把代码直接复制过去就可以用了。

(1)画边框线

边框线是属于样式范畴,而样式的作用范围是整个工作簿(包括所有的工作表),因此我们可以工作簿来创建样式,再给样式设置边框线

创建CreateOrderXls类,代码如下

package cn.itcast.demo;import java.io.FileOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;/*** 创建订单模板*/
public class CreateOrderXls {public static void main(String[] args) throws Exception{// 工作簿HSSFWorkbook book = new HSSFWorkbook();// 工作表HSSFSheet sheet = book.createSheet("采购订单");// 内容样式HSSFCellStyle style_content = book.createCellStyle();style_content.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框style_content.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框style_content.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框style_content.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框// 根据导出的订单样本创建10行4列for(int i = 2; i < 12; i++){HSSFRow row = sheet.createRow(i);//创建订单内容中的行for(int j = 0; j < 4; j++){HSSFCell cell = row.createCell(j);//创建订单内容中的单元格cell.setCellStyle(style_content);//设置单元格的样式}}//保存工作簿到本地目录book.write(new FileOutputStream("c:\\采购订单.xls"));book.close();}
}

 打开结果文件

(2)合并单元格

找出我们需要合并哪些单元格:

第一行是显示订单的标题:比如显示为 “采购订单”,需要合并A、B、C、D列。

第3行的B、C、D列,需要合并成一个单元格,用来显示供应商的名称

第8行,需要合并成一个单元格,用来显示“订单详情”

在保存工作簿前添加如下代码:

 结果:

(3)设置单元格的值

把采购订单里那些固定的显示文本给填上。在合并单元格代码后添加:

 

结果如下

 

(4)设置行高和列宽

输出的结果跟我们要的格式还有差距,需要调整一下行高和列宽

代码如下:

 

结果

 

(4)设置表格的对齐方式和字体

现在看到对齐方式全都是靠左对齐,需要改成居中,字体的大小也要设置一下

代码如下:

 结果:

(6)设置日期格式

订单表内容中有下单、审核、采购、入库日期。我们也需要设置一下日期格式的显示

代码如下:

 测试结果

2.3、后端代码实现

(1)​​​​​​​在IOrdersBiz接口中添加方法exportById

 

(2)​​​​​​​在OrdersBiz中实现方法

 将示例代码中的创建模板的代码复制过来,删除测试日期

// 工作簿
HSSFWorkbook book = new HSSFWorkbook();
// 工作表
HSSFSheet sheet = book.createSheet("采购订单");
// 内容样式
HSSFCellStyle style_content = book.createCellStyle();
style_content.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
style_content.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style_content.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style_content.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
// 根据导出的订单样本创建10行4列
for(int i = 2; i < 12; i++){HSSFRow row = sheet.createRow(i);//创建订单内容中的行for(int j = 0; j < 4; j++){HSSFCell cell = row.createCell(j);//创建订单内容中的单元格cell.setCellStyle(style_content);//设置单元格的样式}
}//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));//标题
sheet.addMergedRegion(new CellRangeAddress(2,2,1,3));//供应商
sheet.addMergedRegion(new CellRangeAddress(7,7,0,3));//订单明细//****** 设置固定文本内容 ******//
//设置标题内容, 注意:单元格必须创建后才能设置。
sheet.createRow(0).createCell(0).setCellValue("采购单");//设置标题内容
sheet.getRow(2).getCell(0).setCellValue("供应商");//设置供应商文本
//已经创建过的row/cell,则通过sheet.getRow.getCell方式获取
sheet.getRow(3).getCell(0).setCellValue("下单日期");
sheet.getRow(3).getCell(2).setCellValue("经办人");
sheet.getRow(4).getCell(0).setCellValue("审核日期");
sheet.getRow(4).getCell(2).setCellValue("经办人");
sheet.getRow(5).getCell(0).setCellValue("采购日期");
sheet.getRow(5).getCell(2).setCellValue("经办人");
sheet.getRow(6).getCell(0).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 < 12; i++){sheet.getRow(i).setHeight((short)500);
}
//设置列宽
for(int i = 0; i < 4; i++){sheet.setColumnWidth(i, 5000);
}//****** 设置对齐方式和字体 ******//
// 内容部分的对齐设置
style_content.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style_content.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
// 设置内容部分的字体
HSSFFont font_content = book.createFont();//创建字体
font_content.setFontName("宋体");//设置字体名称
font_content.setFontHeightInPoints((short)11);//设置字体大小
style_content.setFont(font_content);//设置样式的字体// 标题样式
HSSFCellStyle style_title = book.createCellStyle();
style_title.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style_title.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
HSSFFont font_title = book.createFont();//创建字体
font_title.setFontName("黑体");//设置字体名称
font_title.setBold(true);//加粗
font_title.setFontHeightInPoints((short)18);//设置字体大小
style_title.setFont(font_title);//设置样式的字体
sheet.getRow(0).getCell(0).setCellStyle(style_title);//设置标题样式//****** 设置日期格式 ******//
// 日期格式
HSSFCellStyle style_date = book.createCellStyle();
style_date.cloneStyleFrom(style_content);//日期格式基本上跟内容的格式一样,可以clone过来
HSSFDataFormat dataFormat = book.createDataFormat();
style_date.setDataFormat(dataFormat.getFormat("yyyy-MM-dd hh:mm"));
// 设置日期 的日期格式
for(int i = 3; i < 7; i++){sheet.getRow(i).getCell(1).setCellStyle(style_date);
}//保存工作簿到本地目录
book.write(new FileOutputStream("c:\\采购订单.xls"));
book.close();

 修改创建内容部分的代码,添加rowCnt定义,代表内容部分需要创建的总行数

注入EmpDao和SupplierDao,订单中只保留经办人的编号和供应商的编号,需要把它们转成对应的名称

 

在代码后面添加

//设置供应商的值
sheet.getRow(2).getCell(1).setCellValue(supplierDao.get(orders.getSupplieruuid()).getName());
//****** 设置日期内容 ******//
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());
}//****** 设置经办人的值 ******//
if(null != orders.getCreater()){//下单员sheet.getRow(3).getCell(3).setCellValue(empDao.get(orders.getCreater()).getName());
}
if(null != orders.getChecker()){//审核员sheet.getRow(4).getCell(3).setCellValue(empDao.get(orders.getChecker()).getName());
}
if(null != orders.getStarter()){//采购员sheet.getRow(5).getCell(3).setCellValue(empDao.get(orders.getStarter()).getName());
}
if(null != orders.getEnder()){  //库管员sheet.getRow(6).getCell(3).setCellValue(empDao.get(orders.getEnder()).getName());
}//****** 订单明细 ******//
int rowIndex = 9;
HSSFRow row = null;
for(Orderdetail od : orders.getOrderdetaiList()){row = sheet.getRow(rowIndex);row.getCell(0).setCellValue(od.getGoodsname());row.getCell(1).setCellValue(od.getNum());row.getCell(2).setCellValue(od.getPrice());row.getCell(3).setCellValue(od.getMoney());rowIndex++;
}//****** 合计 ******//
sheet.getRow(rowIndex).getCell(0).setCellValue("合计");
sheet.getRow(rowIndex).getCell(3).setCellValue(orders.getTotalmoney());

 修改  输出给输出流 

修改OrdersAction,添加exportById方法

 2.4、前端代码实现

(1)​​​​​​​引入download.js

在orders.html中引入download.js

​​​​​​​修改orders.js

修改弹出订单详情窗口代码:

 

3、供应商或客户数据导入

 3.1、需求分析

我们需要将批量的供应商(客户)信息导入到系统里,因此我们需要实现导入功能

如下图:点击导入按钮

弹出导入数据对话框:

 

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

3.2、后端代码实现

(1)Dao层编写

修改SupplierDao,添加根据名称查询的条件: 

(2)业务逻辑层编写

在ISupplierBiz中添加方法

在SupplierBiz中添加实现

(3)Action层编写

在SupplierAction中添加上传文件的支持

 

添加upload方法:

 3.3、前端代码

(1)添加导入窗口

修改crud.js,添加导入按钮:

 

 添加导入窗口的初始化与提交

 

ProcessData:

要求为Boolean类型的参数,默认为true。默认情况下,发送的数据将被转换为对象(从技术角度来讲关非字符串)以配合默认内容类型”application/x-www-form-urlencoded”。如果要发送DOM树信息或者其它不希望转换的信息,请设置为false。

ContentType:

要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为”application/x-www-form-urlencoded”。该默认值适合大多数应用场合

 

这篇关于蓝云ERP系统项目笔记——数据的导入与导出(10)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417743

相关文章

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

通过ibd文件恢复MySql数据的操作方法

《通过ibd文件恢复MySql数据的操作方法》文章介绍通过.ibd文件恢复MySQL数据的过程,包括知道表结构和不知道表结构两种情况,对于知道表结构的情况,可以直接将.ibd文件复制到新的数据库目录并... 目录第一种情况:知道表结构第二种情况:不知道表结构总结今天干了一件大事,安装1Panel导致原来服务

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi