在本次项目中,有一个需求,导入本地Excel文件,对比数据库差异数据,再将差异数据导出Excel
项目使用前后端分离,所有这里采用前后端分离思想

  1. 读取本地Excel文件,获取其中的数据
  2. 通过获取的参数查询数据库数据
  3. 对比差异数据
  4. 导出差异数据Excel表格

二、使用步骤

1.引入库

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
<!--如有需要处理大量数据则导入-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

2.读取上传的Excel数据并对比差异数据接口

* 对比上传的Exccel的差异数据 public JSONObject dataComparison(JSONObject jsonobject) { // 请求文件路径地址 String url = jsonobject.getString("url"); Assert.isBlank(url, "清选择文件"); String fullFileName = url; List<JSONObject> list; try { InputStream is = new FileInputStream(fullFileName); list = read2007Xlsx(is); } catch (Exception e) { e.getMessage(); throw new BaseException(400, "读取文件错误"); // 匹配数据库数据 JSONObject params = new JSONObject(); params.put("list", list); JSONObject objectList = matchDatabaseData(params); return objectList ; * 读取excel文件 * XSSF -- 提供读写Microsoft Excel OOXML格式档案的功能 * XSSFWorkbook:是操作Excel2007(以上)的版本,扩展名是.xlsx * @param in * @return * @throws IOException public static List<JSONObject> read2007Xlsx(InputStream in) throws IOException { List<JSONObject> list = new ArrayList<>(); XSSFWorkbook xWorkbook = new XSSFWorkbook(in); // Read the Sheet XSSFSheet xssfSheet = xWorkbook.getSheetAt(0); // Read the Row for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) { XSSFRow xssfRow = xssfSheet.getRow(rowNum); if (xssfRow != null) { // 设置读取格式 xssfRow.getCell(0).setCellType(Cell.CELL_TYPE_STRING); xssfRow.getCell(1).setCellType(Cell.CELL_TYPE_STRING); xssfRow.getCell(2).setCellType(Cell.CELL_TYPE_STRING); xssfRow.getCell(3).setCellType(Cell.CELL_TYPE_STRING); JSONObject params = new JSONObject(); params.put("receivedLinkman", xssfRow.getCell(0).getStringCellValue()); params.put("receivedTelephone", xssfRow.getCell(1).getStringCellValue()); // 开始时间 String _startTime = xssfRow.getCell(2).getStringCellValue(); Date startTime = HSSFDateUtil.getJavaDate(Double.valueOf(_startTime)); params.put("startTime", testTime(startTime)); String _endTime = xssfRow.getCell(3).getStringCellValue(); Date endTime = HSSFDateUtil.getJavaDate(Double.valueOf(_endTime)); params.put("endTime", testTime(endTime)); list.add(params); xWorkbook.close(); return list; * 匹配数据库数据 * key = "list" * @param params private BasePageInfo<JSONObject> matchDatabaseData(JSONObject params) { if (params == null && params.getString("list") == null && params.getJSONArray("list").isEmpty()) { return null; JSONArray array = params.getJSONArray("list"); JSONObject jsonObject = new JSONObject(); if (array != null && array.size() > 0) { jsonObject = array.getJSONObject(0); jsonObject.put("page", params.getString("page")); jsonObject.put("rows", params.getString("rows")); // 查询相关订单数据 BasePageInfo<JSONObject> objectList = iOrderDao.queryOrderByExcel(jsonObject); JSONArray list = params.getJSONArray("list"); // 处理差异数据 List<JSONObject> returnList = processingDifferenceData(list, objectList.getList()); objectList.setList(returnList); return objectList;

3.获取差异数据并导出Excel

前面通过上一个接口获取到差异数据,将差异数据写入Excel表格

    public JSONObject exportExcel(JSONObject jsonObject) {
        // 导出差异数据
        JSONArray list = jsonObject.getJsonArray("list");
        if (list == null) {
            throw new BaseException(400, "缺少导出数据");
        // 获取桌面路径
        String path = getDesktopPath();
        // 填充导出内容
        fillExportContent(path, list);
        return Output.out(Message.OK, Message.EXPORT_EXCEL);
     * 获取桌面路径
     * @return
    private static String getDesktopPath() {
        // 获取桌面
        FileSystemView view = FileSystemView.getFileSystemView();
        File file = view.getHomeDirectory();
        String path = file.getPath();
        path.replace("\\", "/");
        return file.getPath();
     * 填充导出内容
     * @param path 导出路径
     * @param list 导出内容
    private void fillExportContent(String path, JSONArray list) {
        if (list == null && list.size() <= 0) {
            return;
        //创建工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook();//这里也可以设置sheet的Name
        //创建工作表对象
        HSSFSheet sheet = workbook.createSheet();
        //创建工作表的行
        HSSFRow row = sheet.createRow(0);//设置第一行,从零开始
        //第一行第一列
        row.createCell(0).setCellValue("订单号");
        //第一行第二列
        row.createCell(1).setCellValue("收货人");
        //第一行第三列
        row.createCell(2).setCellValue("收货人电话");
        //第一行第四列 settledAmount
        row.createCell(3).setCellValue("订单结算金额");
        row.createCell(4).setCellValue("送货人");
        row.createCell(5).setCellValue("送货人电话");
        row.createCell(6).setCellValue("送货地址");
        // (1wap移动 2pc  3微信小程序 4百度小程序 5第三方平台)
        row.createCell(7).setCellValue("订单来源");
        // 转单平台(0未转 1花娃 2花大侠 3无需转单 4转单宝)
        row.createCell(8).setCellValue("转单平台");
        row.createCell(9).setCellValue("创建时间");
        row.createCell(10).setCellValue("支付类型");
        // 设置表体内容
        for (int i = 0; i < list.size(); i++) {
            JSONObject listJSONObject = list.getJSONObject(i);
            row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(listJSONObject.getString("orderCode"));
            row.createCell(1).setCellValue(listJSONObject.getString("receivedLinkman"));
            row.createCell(2).setCellValue(listJSONObject.getString("receivedTelephone"));
            row.createCell(3).setCellValue(listJSONObject.getString("settledAmount"));
            row.createCell(4).setCellValue(listJSONObject.getString("sendLinkman"));
            row.createCell(5).setCellValue(listJSONObject.getString("sendTelephone"));
            row.createCell(6).setCellValue(listJSONObject.getString("address"));
            String platform = listJSONObject.getString("platform");
            switch (platform) {
                case "1":
                    platform = "移动端";
                    break;
                case "2":
                    platform = "pc端";
                    break;
                case "3":
                    platform = "微信小程序";
                    break;
                case "4":
                    platform = "百度小程序";
                    break;
                case "5":
                    platform = "第三方平台";
                    break;
            row.createCell(7).setCellValue(platform);
            String deferentPlatform = listJSONObject.getString("deferentPlatform");
            switch (deferentPlatform) {
                case "0":
                    deferentPlatform = "未转";
                    break;
                case "1":
                    deferentPlatform = "花娃";
                    break;
                case "2":
                    deferentPlatform = "花大侠";
                    break;
                case "3":
                    deferentPlatform = "无需转单";
                    break;
                case "4":
                    deferentPlatform = "转单宝";
                    break;
            row.createCell(8).setCellValue(deferentPlatform);
            row.createCell(9).setCellValue(listJSONObject.getString("createTime"));
            row.createCell(10).setCellValue(listJSONObject.getString("payName"));
        // workbook.setSheetName(0,"sheet的Name");//设置sheet的Name
        //文档输出
        try {
            FileOutputStream out = new FileOutputStream(path + "/" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString() + ".xls");
            workbook.write(out);
            out.close();
        } catch (Exception e) {
            e.getMessage();
            throw new BaseException(400, "导出错误");
                    文章目录前言一、思路二、使用步骤1.引入库2.读取上传的Excel数据并对比差异数据接口3.获取差异数据并导出Excel总结前言在本次项目中,有一个需求,导入本地Excel文件,对比数据库差异数据,再将差异数据导出Excel项目使用前后端分离,所有这里采用前后端分离思想一、思路读取本地Excel文件,获取其中的数据通过获取的参数查询数据库数据对比差异数据导出差异数据Excel表格二、使用步骤1.引入库&lt;dependency&gt;    &lt;groupId&gt;o
				
springboot实现上传Excel文件数据库中的数据进行比对 首先先写好文件上传的接口,然后上传需要比对数据文件,在点击数据比对 下面是一部分数据比对的代码: 后端controller部分: * 上传Excel文件数据中的数据进行对比 * @param request * @return * @throws BiffException * @throws IOExceptio...
DataGear是一款数据可视化分析平台,使用Java语言开发,采用浏览器/服务器架构,支持SQL、CSV、Excel、HTTP接口、JSON等多种数据源,主要功能包括数据管理、SQL工作台、数据导入/导出、数据集管理、图表管理、看板管理等。 系统特点: 1、可管理数据库驱动 可通过驱动程序管理功能添加数据库驱动程序,无需重启,即可支持连接新数据库; 2、多种格式的数据集 支持SQL、CSV、Excel、HTTP接口、JSON等多种格式的数据集; 3、多数据集聚合图表 一个图表可添加多个不同格式的数据集,将它们聚合展示; 4、插件式图表类型 每一种类型的图表都以图表插件形式提供,并内置了大量图表插件,管理员也可上传自定义图表插件,丰富系统图表类型; 5、可自由编辑的HTML看板模板 看板使用原生的HTML网页作为模板,可自由编辑、绑定、异步加载图表,并支持将任意HTML网页导入为看板; 6、丰富的看板API 看板页面内置了大量的页面端API,可用于个性化扩展看板功能。 模块介绍: 1、datagear-analysis 数据分析底层模块,定义数据集、图表、看板API 2、datagear-connection 数据库连接支持模块,定义可从指定目录加载JDBC驱动、新建连接的API 3、datagear-dataexchange 数据导入/导出底层模块,定义导入/导出指定数据数据的API 4、datagear-management 系统业务服务模块,定义数据源、数据分析等功能的服务层API 5、datagear-meta 数据源元信息底层模块,定义解析指定数据源表结构的API 6、datagear-persistence 数据数据管理底层模块,定义读取、编辑、查询数据源表数据的API 7、datagear-util 系统常用工具集模块 8、datagear-web 系统业务web模块,定义web控制器、操作页面 9、datagear-webapp 系统Web应用程序组织模块,定义将系统构建为标准WAR程序包的结构 10、datagear-webappembd 系统独立应用程序组织模块,定义将系统构建为独立可执行程序的结构 Java 8+ Servlet 3.0+ (执行单元测试编译,需要预先配置单元测试环境) mvn clean package (不执行单元测试编译,无需预先配置单元测试环境) mvn clean package -DskipTests cd datagear-webappembd/target/datagear-[version] (Linux环境) ./startup.sh (windows环境) startup.bat 1、将datagear以maven工程导入至IDE工具; 2、将datagear-webapp作为Web应用添加至servlet容器(比如Tomcat); 3、以调试模式运行Servlet容器。 调试注意: 在调试开发分支前(dev-*),建议先备份DataGear工作目录([用户主目录]/.datagear), 因为开发分支程序启动时会修改DataGear工作目录,可能会导致先前使用的正式版程序、以及后续发布的正式版程序无法正常启动。 调试时,系统仅会在第一次启动时升级内置数据库(Derby),如果遇到内置数据库访问异常,需要查看 datagear-management/src/main/resources/org/datagear/management/ddl/datagear.sql 文件,从中查找需要更新的SQL语句,手动更新至内置数据库。 系统自带了一个可用于为内置数据库执行SQL语句的简单工具类org.datagear.web.util.DerbySqlClient,可以在IDE中直接运行。注意:运行前需要先停止DataGear程序。 DataGear数据可视化分析平台 更新日志: v2.4.0 整理chartSetting.js和chartSupport.js中的弃用内容
一个简单JAVA 小工程进行两个MYSQL数据库对象的比较,导入eclipse中,修改jdbc.properties文件中的JDBC信息,然后直接运行action类中的main方法,生成EXCELexcel中包含表,表中列,索引,函数过程差异比对结果。 这个主要比对的是表,表中列的基本信息比较,比较是否存在是否类型一致等,对于函数存储过程则只是简单的比较是否存在,内容没有比对。如果谁感兴趣可以完善该比对功能。 JAVA代码,不复杂,看看就明白,都是采用简单代码。 开发的环境: JDK1.7 eclipse
数据库设计工具BDB 最新版 v3.0 v3.0 下载: 1) 中文简体版: [url]http://www.bainsoft.com/downloads/BDB.rar[/url] 2) 英文版: [url]http://www.bainsoft.com/downloads/BDBEN.rar[/url] v3.0版本更新: 1, 增加E-R图支持 2,增加数据库对象查询功能 3,添加方案右键菜单 4,SQL查询分析功能完善 5,修正了一些bug v3.0浏览: [url]http://www.bainsoft.com/products.html[/url] 贝恩网站: [url]http://www.bainsoft.com[/url] 一些特性, SQL智能化查询分析: [url]http://blog.csdn.net/12rain/archive/2008/03/12/2172068.aspx[/url] 关于BDB: BDB是贝恩软件([url]WWW.bainsoft.COM[/url])发布的数据库设计和数据库部署软件, 支持Oracle,MS SQLServer,Access,MySQL,SQLAnyWhere和Sybase数据库。新版本加入SQL查询分析自动完成功能。 BDB的主要功能及特性: 1,数据库设计。 快速建立数据库模型。支持正向工程和反向工程; 支持数据库模型和实体数据库之间的比对更新和双向同步。 2,数据库部署。 自动创建数据库部署程序。 除常规调用外,在BDB中还提供了外部命令行调用数据库自动安装支持, 通过该功能可把数据库部署集成到软件安装程序中。 3,数据库自动升级。 通过BDB进行数据库自动升级部署。 可在不影响数据数据的前提下进行数据库自动升级。 4,数据库迁移。 完整的数据库迁移方案。可进行跨数据库平台迁移。可迁移的数据对象包括: 数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据数据。 5,查询分析 数据数据快速查询,编辑及导出操作: A,SQL智能化输入自动完成。 A,提供专用的SQL编辑器。支持语法高亮,脚本预定义。 B,支持脚本快速选择输入。 C,提供了不同数据库平台下统一的快速查询语法支持(如“DESC”)。 D,数据数据Excel文件之间的双向导入导出操作。 E,提供特定的数据文件格式,用于不同数据库之间的数据导入,导出。 6,SQL脚本预输出 数据库模型或实体数据库有所改动时,可预输出更新SQL脚本,同时还可以 进行数据库重建SQL脚本预览。 7,支持跨数据库平台。 只需按熟悉的数据库平台进行数据库设计,在部署到其他数据库平台时, 系统会进行数据类型转换及不同数据库平台下的语法差异处理。 8,方案模式。 支持多个数据库管理。 9,可重用属性定义及同步。 10,开发语言支持。 开放的数据库物理结构文件格式(XML标准格式),并提供了外部调用数据库结构源程序 (包含C#/Delphi/JAVA三个版本)。 11,支持多语言。 可根据需要增加新的语言包。
今天客户提出一个问题,能否在产品中2个子系统中的实现所有的excel导入功能过滤掉已有的数据。 我思考了一番,想到了3种大概的解决思路: 1、在插入每条数据的时候,查到对应的表找出是否存在对应的数据,如存在就跳过。 2、把整个excel文件的里的内容存入到一张临时表中,然后查询去重并插入到目的表中。select distinct into 或insert i...
最近碰到了文本对比的问题,也查找了很多方法,针对这个问题总结下经验,希望能够帮助到大家。 pom添加依赖 ,这里需要使用到diff-utils这里我使用的是diffutils 1.2.1.jar <dependency> <groupId>com.googlecode.java-diff-utils</groupId>
Java实现两个Excel表格中数据的对比 最近疫情又开始严重了,身为班长的我理所当然的又担负起了这个打卡的职责。(超级麻烦,因为每个班总有几个顽固分子你不给他私信打电话他是不会主动打卡的。。。) 他们打完卡之后我需要去根据今天的数据和昨天对比,看看是否有变化,因为大部分人即使位置变动了人也懒得标注- -! 于是在工作比较闲暇的今天我就想着琢磨一下能不能写个接口传上去能直接告诉我对比结果(其实这个用pyhon会简单很多,但是我不会),那么说干就干! 开发环境:springboot
jxl实现excel数据导出,26000条记录,测试导出时间是19s,例子不算复杂,没有excel样式的处理,可以自己扩展哈,有数据库文件,部署即可看到效果!!! 有三个功能:代码构建数据的导出、数据库数据的导出(从配置文件读取表头)、从模板读取表头和列
最近遇到这样一个需求:需要读取Excel内容(里面含有许多文章),查询指定关键字在各个文章中出现的次数,将结果返回到excel中。我不知道怎么用java操作excel,于是上网四处寻找解决办法,结果要么是只能对excel2003或excel2007版的才有用,要么是copy过来的代码压根运行不了! 所以我在这里出一篇文章,为大家避避雷,不用特意去花积分下载资源,到头来反而运行不了,而且适合07版本以后的excel。 2. 查询数据库中的数据,将数据存储到Java中的数据结构中,如List或Map。 3. 创建Excel工作簿和工作表,使用Apache POI库中的相关类。 4. 将数据写入Excel表格中,可以使用Apache POI库中的相关类。 5. 最后,保存Excel文件。 需要注意的是,导入数据Excel表格中时,需要根据Excel表格的格式进行相应的处理,如设置单元格的格式、合并单元格等。