精华内容
下载资源
问答
  • 读取上传的Excel数据对比差异数据接口3.获取差异数据并导出Excel总结 前言 在本次项目中,有一个需求,导入本地Excel文件,对比数据库差异数据,再将差异数据导出Excel 项目使用前后端分离,所有这里采用前后端...


    前言

    在本次项目中,有一个需求,导入本地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. 获取路径的时候使用 “/”
    展开全文
  • Ctrl + /: ①选中要进行数据对比的一列,按住Ctrl,选中另一列; ②按住Ctrl + / ,有差异的单元格会被选中 ③选择填充,高亮有差异的数据 Ctrl +H:

    Ctrl + /:
    ①选中要进行数据对比的一列,按住Ctrl,选中另一列;
    在这里插入图片描述
    ②按住Ctrl + / ,有差异的单元格会被选中
    在这里插入图片描述
    ③选择填充,高亮有差异的数据
    在这里插入图片描述
    Ctrl +H:
    ①选中2列:在这里插入图片描述
    ②按住CTRL+G:
    在这里插入图片描述
    在这里插入图片描述

    ③这时有差异的单元格就会被选中,可以为其填充颜色
    在这里插入图片描述
    在这里插入图片描述
    条件格式
    ①新建规则:只为包含以下内容的单元格设置格式
    在这里插入图片描述
    ②新建格式规则:选中另外一个表格的第一个单元格,按【F4】三下
    在这里插入图片描述
    在这里插入图片描述
    ③选择格式:设置数据有差异的单元格的格式
    在这里插入图片描述

    展开全文
  • 两秒对比100万数据差异

    千次阅读 2018-03-15 16:12:33
    日常工作中,有可能需要对比两个文件的数据差异,在大量数据的情况下,常用的办法是使用数据库对比,现推荐一个使用python脚本对比数据的方法,实际测试,文件一有60万行数据,文件2有50万行数据对比差异耗时1.5S...

         日常工作中,有可能需要对比两个文件的数据差异,在大量数据的情况下,常用的办法是使用数据库对比,现推荐一个使用python脚本对比数据的方法,实际测试,文件一有60万行数据,文件2有50万行数据,对比差异耗时1.5S,大大节省了对比数据的耗时,在数据库里加索引的情况下,也需要7S左右出结果,所以python是无比神奇的。


    代码:

    import argparse
    import sys
    import time
    import datetime


    ##################wirten by diorlitao####################################
    # 使用方法
    #需要安装python3.6及以上版本
    #1、将脚本和要对比的文本文件放到同一个目录下
    #2、将两个需要对比的文本转为UTF-8格式
    #3、在cmd命令行模式下执行:python diff_file.py -f1 1.txt -f2 2.txt
    ###################1.txt 和 2.txt是要对比的文本文件#######################
    def readfile(filename):
        try:
            with open(filename, 'r',encoding='UTF-8') as fileHandle:
                text = fileHandle.read().splitlines()
                #print(text)
            return text
        except IOError as e:
            print("Read file Error:", e)
            sys.exit()


    def diff_file(filename1, filename2):
        text1_lines = readfile(filename1)
        text2_lines = readfile(filename2)
        with open('result1.txt', 'w', encoding='UTF-8') as resultfile:
            resultfile.write('--------------文件1与文件2的差异-------------------'+'\n')
            diff_set = set(text1_lines).difference(set(text2_lines))
            for i in diff_set:
                resultfile.write(str(i)+'\n')
        with open('result2.txt', 'w', encoding='UTF-8') as resultfile2:
            resultfile2.write('--------------文件2与文件1的差异-------------------' + '\n')
            diff_set2 = set(text2_lines).difference(set(text1_lines))
            for j in diff_set2:
                resultfile2.write(str(j) + '\n')


    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description="传入两个文件参数")
        parser.add_argument('-f1', action='store', dest='filename1', required=True)
        parser.add_argument('-f2', action='store', dest='filename2', required=True)
        given_args = parser.parse_args()
        filename1 = given_args.filename1
        filename2 = given_args.filename2
        begin = datetime.datetime.now()
        print('任务开始:'+ str(begin))
        diff_file(filename1, filename2)
        end = datetime.datetime.now()
        print('任务结束,耗时:'+ str((end-begin)))

    展开全文
  • 如何更好的发现数据差异,我们更多时候是选择条件格式功能。下面将通过例子说明功能如何高效结合需求。 1. 查看数据异常点: 如下支出和营收数据, 我们可以通过分位数拿到离群值、标注异常数据,或者标注大于...

    更多文章可关注微信公众号:Excelwork 

    我们处理数据选择Excel,第一是直观的界面,对广大新手或者老手都很友好,二是函数、操作、VBA等强大的功能。对于摆在我们面前的数据,大多数时候Excel是首选作为数据初步探索的工具。

        如何更好的发现数据差异,我们更多时候是选择条件格式功能。下面将通过例子说明功能如何高效结合需求。

    1. 查看数据异常点:

        如下支出和营收数据,

        我们可以通过分位数拿到离群值、标注异常数据,或者标注大于均值、大于中位数或指定数值等不同需求的数据。我们用均值演示下:

        我们也可以对同一组数进行多个条件判别,即施加多个公式,比如标注低于下四分位数的值为绿色:

        Excel里标注格式除了填充,还可应用单元格格式那些设置功能。同时,如果不需要跟公式对比,按条件格式中提供的,手动点击操作即可,这里就不多做介绍了。

    2. 隔行增加底色以便观察:

        隔行填充颜色,我们可以借助公式取余来解决:=mod(row(),2)=1

    3. 对比数据差异

        在这个公众号内很经典的案例了,这里再介绍下:当有两个sheet数据,需要对比不同时,总不能肉眼看,这里应用条件格式简单的小公式能解决大问题:=a1<>Sheet2!a1

        切换sheet1和sheet2,我们很容易就发现数据差异位置了。

    展开全文
  • 最近工作中经常需要做数据对比,用excel公式也很方便,但刚好正在学习Python,所以就想用Python来实现数据对比 操作步骤如下: 安装xlrd库 cd进入Python安装目录,执行pip install xlrd 准备数据 `import ...
  • Excel VS Pandas在数据处理中的差异对比
  • select * from test_123 where cfilename not in(select filename from test_456)
  • 差异数据对比和整理

    千次阅读 2018-03-30 11:45:31
    在我们日常的工作中,常常会遇到很多结构相同,但来源不同的数据。...这时,如何对这些重叠数据进行对比,从而发现和纠正其中的错误,就需要我们常说的“自动对账”操作了。在一般业务系统的设计开发中,这种对账...
  • 通过分析气温、气压、相对湿度、风等要素的对比差值及其标准差、对比差值的频次分布和空间分布等,探讨自动站与人工观测数据差异的可能原因。结果表明:内蒙古自动观测与人工观测各气象要素均存在一定的差异,对所有...
  • WEB开发时,页面上的数据输入通常有下面几种类型,从简单到复杂依次有 表单数据输入:一维结构 表格数据输入:二维结构 树状数据输入:三维以上的结构 表单数据最简单,表格数据比较麻烦,树状数据比较复杂。 ...
  • 为了找出报表里多出了哪些数据,需要将报表数据与系统数据进行对比。 报表里的数据量大,手动对比浪费时间,所以找到这个使用VLOOKUP函数的方法。 下面统一抽象表示为表A,表B。 情况:表A的数据大于表B数据。 ...
  • 可以进行电子表格数据比对,分析数据之间的差异
  • <p>scrapy框架怎么实现while循环爬取同一个页面 实现每次爬取对比上一次数据差异差异写入数据库或本地文本文档 我是比较小白的 但是想得到个具体的方法 思路 我好朝这方面研究 查资料</p>
  • 二进制数据包括 Binary、Varbinary 和Image  Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。  Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从1 到8000。其存储窨的大小是 n+ ...
  • 在预算费用调整后,预算管理人员都会希望看到各单位预算费用的初始情况和调整情况,简单直观地观察到哪些数据有变更,甚至观察到变更值是多少,检查各单位的预算变更情况,严格控制和调控费用的输出情况,甚至用于...
  • 数据对比软件

    2018-11-21 22:28:45
    想知道两个数据有哪些差异吗,这是时候就需要一个好用的对比软件,清强烈推荐改款软件,超好用的。博主不骗人的!
  • 通过config里面配置数据库的连接,对比两者间的区别。
  • --查询相同数据 select [字段名]或[*] from [表名称1] intersect select [字段名]或[*] from [表名称2] --查询不同数据 select [字段名]或[*] from [表名称1] except select [字段名2]或[*] from [表...
  • 现在有表格如下,差异A中的红色标记为区域1在区域2中找不到对应的值,差异B中的红色标记为区域2在区域1中找不到对应的值那么怎么去查找呢?这里用到COUNTIF跟数组公式C3=SUM(COUNTIF(A3,$E$3:$E$6)*COUNTIF(B3,$F$3:...
  • 数据库差异对比工具

    千次阅读 2020-02-29 23:40:10
    把去年写的一个数据库差异对比工具完善了下,修复了一些bug,以及新增了一些功能。主要分析对比功能由js完成。 源码地址:https://gitee.com/xgpxg/sim-framework/tree/master/sim-db-dif 如果对你有帮助,来点个赞...
  • sheet1第一列存放数据量大的对比数据,sheet2第一列存放数据量小的对比数据。 在sheet1的第二列录入函数:=VLOOKUP(A:A,Sheet2!A:A,1,FALSE)保存后复制到与sheet1第一列等行,保存后通过筛选条件即可。 ...
  • 表A中为文本(有绿色三角符号),表B为数字(没有三角符号),而自动对比时会检查数据类型,怎么办? 执行对比: 得到结果: 这时候要解决类型问题(即绿色三角形标志) 点击灰色区域全选 哪个...
  •  * 获取在第一个集合中但是不在第二个集合中的数据  * @param first 第一个集合  * @param second 第二个集合   * @param compareFieldName 需要比较的属性名称  * @return   * @throws ...
  • 将扫描枪的数据导入到数据库中。 比较两张表中是否有不同的数据: SELECT id,Name FROM ( SELECT id, Name FROM t1 UNION ALL SELECT id,Name FROM t2 ) tbl GROUP BY id, Name HAVING count(*) = 1 ORDER BY ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,964
精华内容 785
关键字:

数据对比差异