From 7b4a49ef613f1a6fe2a0e1964d878c506f485b58 Mon Sep 17 00:00:00 2001 From: lisai Date: Sun, 27 Nov 2022 23:33:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=84=9A=E6=9C=AC=EF=BC=8C=E6=A0=B9=E6=8D=AEexcel?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/dataadjustment/ExcelUtils.java | 230 ++++++++++++++++++ .../src/main/java/dataadjustment/Main.java | 195 ++++++++++++--- 2 files changed, 395 insertions(+), 30 deletions(-) create mode 100644 ssjygl-xsx-service/src/main/java/dataadjustment/ExcelUtils.java diff --git a/ssjygl-xsx-service/src/main/java/dataadjustment/ExcelUtils.java b/ssjygl-xsx-service/src/main/java/dataadjustment/ExcelUtils.java new file mode 100644 index 0000000..59aba25 --- /dev/null +++ b/ssjygl-xsx-service/src/main/java/dataadjustment/ExcelUtils.java @@ -0,0 +1,230 @@ +package dataadjustment; + +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.io.InputStream; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @author 李赛 + * @date 2022-11-25 9:13 + */ +public class ExcelUtils { + + /** + * 1、将单元格的内容转换为字符串 + * + * @param cell 单元格 + * @return 返回转换后的字符串 + */ + public static String convertCellValueToString(Cell cell) { + //1.1、判断单元格的数据是否为空 + if (cell == null) { + return null; + } + //1.2、设置单元格数据的初始值 + String cellValue = null; + //1.3、获取单元格数据的类型 + switch (cell.getCellType()) { + case NUMERIC: + //1.3.1、获取到单元格数据的格式 + short dataFormat = cell.getCellStyle().getDataFormat(); + if (DateUtil.isCellDateFormatted(cell)) { + SimpleDateFormat sdf = null; + //1.3.1.1、处理日期格式,根据不同日期长度去判断 + switch (dataFormat) { + case 14: + sdf = new SimpleDateFormat("yyyy/MM/dd"); + break; + case 21: + sdf = new SimpleDateFormat("HH:mm:ss"); + break; + case 22: + sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + break; + } + //1.3.1.2、处理时间格式 + Date date = cell.getDateCellValue(); + assert sdf != null; + cellValue = sdf.format(date); + } else if (dataFormat == 0) { + //1.3.2、处理普通数字格式 + DecimalFormat format = new DecimalFormat("0"); + double numericCellValue = cell.getNumericCellValue(); + cellValue = format.format(numericCellValue); + } + break; + case STRING: + //处理字符串类型 + cellValue = cell.getStringCellValue(); + break; + case BOOLEAN: + //处理布尔类型 + boolean booleanCellValue = cell.getBooleanCellValue(); + cellValue = Boolean.toString(booleanCellValue); + break; + case FORMULA: + //处理函数类型 + cellValue = cell.getCellFormula(); + break; + case ERROR: + byte errorCellValue = cell.getErrorCellValue(); + cellValue = Byte.toString(errorCellValue); + break; + default: + break; + } + return cellValue; + } + + /** + * 2、处理合并单元格里面的数据 + * + * @param sheet 工作薄 + * @return 返回合并单元格后里面的数据 + */ + public static List getCombineCell(Sheet sheet) { + List list = new ArrayList(); + //2.1、获得一个 sheet 中合并单元格的数量 + int sheetMergerCount = sheet.getNumMergedRegions(); + //2.2、遍历合并单元格 + for (int i = 0; i < sheetMergerCount; i++) { + //2.2.1、获得合并单元格加入list中 + CellRangeAddress rangeAddress = sheet.getMergedRegion(i); + list.add(rangeAddress); + } + return list; + } + + /** + * 3、判断单元格是否为合并单元格 + * + * @param listCombineCell 存放合并单元格的list + * @param cell 需要判断的单元格 + * @param sheet sheet + */ + public static String isCombineCell(List listCombineCell, Cell cell, Sheet sheet) { + //3.1、设置第一个单元格和最后一个单元格的值 + int firstColumn = 0; + int lastColumn = 0; + //3.2、设置第一个单元格和最后一个行的值 + int firstRow = 0; + int lastRow = 0; + //3.3、初始化单元格值 + String cellValue = null; + for (CellRangeAddress rangeAddress : listCombineCell) { + //3.3.1、获得合并单元格的起始行, 结束行, 起始列, 结束列 + firstColumn = rangeAddress.getFirstColumn(); + lastColumn = rangeAddress.getLastColumn(); + firstRow = rangeAddress.getFirstRow(); + lastRow = rangeAddress.getLastRow(); + //3.3.2、判断是不是合并单元格 + if (cell.getRowIndex() >= firstRow && cell.getRowIndex() <= lastRow) { + if (cell.getColumnIndex() >= firstColumn && cell.getColumnIndex() <= lastColumn) { + //3.3.2.1、获取行数据 + Row fRow = sheet.getRow(firstRow); + //3.3.2.2、获取单元格数据 + Cell fCell = fRow.getCell(firstColumn); + //3.3.2.3、对有合并单元格的数据进行格式处理 + cellValue = convertCellValueToString(fCell); + break; + } + } else { + //3.3.3、对没有合并单元格的数据进行格式处理 + cellValue = convertCellValueToString(cell); + } + } + //3.4、返回处理后的单元格数据 + return cellValue; + } + + /** + * 4、判断sheet页中是否有合并单元格 + * + * @param sheet sheet + * @return 返回值 + */ + private static boolean hasMerged(Sheet sheet) { + int numMergedRegions = sheet.getNumMergedRegions(); + if (numMergedRegions > 0) { + return true; + } else { + return false; + } + } + + /** + * 5、读取excel文件内容 + * + * @param inputStream 输入流 + * @return 返回值 + */ + public static List importExcel(InputStream inputStream) { + //5.1、定义一个集合用来存储Object数据 + List list = new ArrayList<>(); + try { + //5.2、创建工作薄 + Workbook workbook = WorkbookFactory.create(inputStream); + //5.3、获取工作薄里面sheet的个数 + int sheetNum = workbook.getNumberOfSheets(); + //5.4、遍历每一个sheet + for (int i = 0; i < sheetNum; i++) { + Sheet sheet = workbook.getSheetAt(i); + //5.4.1、获取sheet中有数据的行数 + int rows = sheet.getPhysicalNumberOfRows(); + for (int j = 0; j < rows; j++) { + //5.4.1.1、过滤掉文件的表头(视文件表头情况而定) + if (i == 1 || j == 0) { + continue; + } + //5.4.1.2、获取每一行的数据 + Row row = sheet.getRow(j); + if (row == null) { + System.out.println("row is null"); + } else { + //5.4.1.3、得到每一行中有效单元格的数据 + int cells = row.getPhysicalNumberOfCells(); + //5.4.1.4、定义一个Object数组用来存储读取单元格的数据 + Object[] objects = new Object[cells]; + //5.4.1.5、初始化对象数组的下标 + int index = 0; + //5.4.1.6、遍历每一个有效的单元格数据 + for (int k = 0; k < cells; k++) { + //5.4.1.6.1、获取每一个单元格的数据 + Cell cell = row.getCell(k); + //5.4.1.6.2、判断当前sheet页是否合并有单元格 + boolean b = hasMerged(sheet); + if (b) { + //5.4.1.6.2.1、判断当前单元格是不是合并单元格,如果是则输出合并单元格的数据,不是则直接输出 + List listCombineCell = getCombineCell(sheet); + String combineCell = isCombineCell(listCombineCell, cell, sheet); + //5.4.1.6.2.1.2、对单元格的数据进行处理 + objects[index] = combineCell; + } else { + String cellValueToString = convertCellValueToString(cell); + objects[index] = cellValueToString; + } + //5.4.1.6.3、下标累加 + index++; + } + //5.4.1.7、将对象数组里面的数据添加到list集合中去 + list.add(objects); + } + } + } + System.out.println("导入文件解析成功!"); + } catch (Exception e) { + System.out.println("导入文件解析失败!"); + e.printStackTrace(); + return null; + } + ; + //5.5、返回List集合 + return list; + } +} diff --git a/ssjygl-xsx-service/src/main/java/dataadjustment/Main.java b/ssjygl-xsx-service/src/main/java/dataadjustment/Main.java index ffeaf0e..ef8bb8e 100644 --- a/ssjygl-xsx-service/src/main/java/dataadjustment/Main.java +++ b/ssjygl-xsx-service/src/main/java/dataadjustment/Main.java @@ -2,6 +2,7 @@ package dataadjustment; import com.cowr.common.enums.OrderStateEnum; import com.cowr.common.enums.OrderTypeEnum; +import com.cowr.common.utils.DateTimeUtil; import com.cowr.model.*; import com.cowr.service.ssjygl.supermarket.SupermarketSyncService; import com.cowr.service.ssjygl.synctask.SyncTaskService; @@ -13,22 +14,47 @@ import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.IAtom; import com.jfinal.plugin.druid.DruidPlugin; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.math.BigDecimal; import java.sql.Connection; -import java.util.Date; -import java.util.List; +import java.text.ParseException; +import java.util.*; /** * @author 李赛 * @date 2022-09-28 0:30 + * @deprecated 数据调整 */ public class Main { - public static void main(String[] args) { + public class DOrder { + OrderTemp orderTemp; + String invoiceNumber; // 发票代码 + String invoiceCode; // 发票号码 + String sqr; + String spr; + + public DOrder(OrderTemp orderTemp, String invoiceNumber, String invoiceCode, String sqr, String spr) { + this.orderTemp = orderTemp; + this.invoiceCode = invoiceCode; + this.invoiceNumber = invoiceNumber; + this.sqr = sqr; + this.spr = spr; + } + } + + public static void main(String[] args) throws Exception { + Main m = new Main(); PropKit.use("db.properties"); CacheData.service_enable = true; - // 在 jdbc 连接 url 字符串中添加 useInformationSchema=true 这个参数,才能通过 Connection 直接获取表的描述 DruidPlugin dp = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim()); dp.start(); @@ -40,22 +66,24 @@ public class Main { SupermarketSyncService.me.initSupCache(); - Date now = new Date(); - List orders = OrderTemp.dao.find("select * from order_temp where customer_id = 172 and state = 5 and create_time >= '2022-03-04' and create_time < '2022-04-25'"); + Date now = new Date(); - Main m = new Main(); + List orders = m.imp(); + +// List orders = OrderTemp.dao.find("select * from order_temp where customer_id = 172 and state = 5 and create_time >= '2022-03-04' and create_time < '2022-04-25'"); +// +// Db.tx(new IAtom() { @Override public boolean run() { try { for (int i = 0; i < orders.size(); i++) { System.out.println("处理 " + i); - OrderTemp o = orders.get(i); + DOrder o = orders.get(i); if (!m.pass(o, now)) { return false; } - } return true; @@ -67,7 +95,113 @@ public class Main { }); } - private boolean pass(OrderTemp order, Date now) { + private List imp() throws ParseException { + String filepath = "C:\\Users\\lisai\\OneDrive\\文档\\黄砂经营管理\\浠水\\9月1日到11月7日补开普票统计.xlsx"; + List out = new ArrayList<>(); + + try (FileInputStream in = new FileInputStream(new File(filepath))) { + Workbook workbook = WorkbookFactory.create(in); + + //5.3、获取工作薄里面sheet的个数 + int sheetNum = workbook.getNumberOfSheets(); + //5.4、遍历每一个sheet + for (int i = 0; i < sheetNum; i++) { + Sheet sheet = workbook.getSheetAt(i); + //5.4.1、获取sheet中有数据的行数 + int rows = sheet.getPhysicalNumberOfRows(); + String sheetname = sheet.getSheetName(); + int supermarket_id = 0; + + if (sheetname.contains("盐港(永安)")) { + supermarket_id = 8; + } else if (sheetname.contains("融嘉")) { + supermarket_id = 5; + } else if (sheetname.contains("石畈")) { + supermarket_id = 4; + } else if (sheetname.contains("城隍")) { + supermarket_id = 3; + } else if (sheetname.contains("竹瓦")) { + supermarket_id = 1; + } else if (sheetname.contains("团陂")) { + supermarket_id = 2; + } else { + System.out.println("sheet name 错误"); + return null; + } + + for (int j = 3; j < rows; j++) { + Row row = sheet.getRow(j); + if (row == null) { + System.out.println("row is null j=" + j + " " + sheetname); + } else { + String 客户 = ExcelUtils.convertCellValueToString(row.getCell(1)); + + if (StrKit.isBlank(客户)) { + continue; + } + + String 起止时间 = ExcelUtils.convertCellValueToString(row.getCell(2)); + String 订单量 = ExcelUtils.convertCellValueToString(row.getCell(3)); + double 销量 = row.getCell(4).getNumericCellValue(); + double 金额 = row.getCell(5).getNumericCellValue(); + String 发票代码 = ExcelUtils.convertCellValueToString(row.getCell(6)); + String 发票编号 = ExcelUtils.convertCellValueToString(row.getCell(7)); + String 申请人 = ExcelUtils.convertCellValueToString(row.getCell(8)); + String 审批人 = ExcelUtils.convertCellValueToString(row.getCell(9)); + + String[] 起止 = 起止时间.split("至"); + Date stm = DateTimeUtil.sdfhms.get().parse(起止[0] + " 00:00:00"); + Date etm = DateTimeUtil.sdfhms.get().parse(起止[1] + " 23:59:59"); + + List orders = OrderTemp.dao.find("select * from order_temp " + + " where customer_name = ? " + + " and supermarket_id = ? " + + " and state = 5 " + + " and create_time >= ? " + + " and create_time <= ? ", 客户, supermarket_id, stm, etm); + + BigDecimal sum销量 = new BigDecimal("0"); + BigDecimal sum金额 = new BigDecimal("0"); + + for (OrderTemp o : orders) { + sum销量 = sum销量.add(o.getWeight()); + sum金额 = sum金额.add(o.getTotalPrice()); + } + + if (!Integer.valueOf(订单量).equals(orders.size())) { + System.out.println("订单量信息错误 [" + 客户 + "]" + 订单量 + ", " + orders.size()); + continue; +// return null; + } + + if (!Double.valueOf(销量).equals(sum销量.doubleValue())) { + System.out.println("销量信息错误 [" + 客户 + "]" + 销量 + ", " + sum销量.doubleValue()); + continue; +// return null; + } + + if (!Double.valueOf(金额).equals(sum金额.doubleValue())) { + System.out.println("金额信息错误 [" + 客户 + "]" + 金额 + ", " + sum金额.doubleValue()); + continue; +// return null; + } + + for (OrderTemp o : orders) { + out.add(new DOrder(o, 发票代码, 发票编号, 申请人, 审批人)); + } + } + } + } + + } catch (IOException e) { + e.printStackTrace(); + } + + return out; + } + + private boolean pass(DOrder o, Date now) { + OrderTemp order = o.orderTemp; InvoiceReceive receive = InvoiceReceiveService.me.checkReceive(order.getSupermarketId(), order.getInvoiceNumber(), order.getInvoiceCode()); if (receive == null) { @@ -80,27 +214,29 @@ public class Main { model.setSupermarketId(order.getSupermarketId()); model.setCreateTime(now); - if (order.getSupermarketId() == 3) { - model.setCreateUserId(29); - model.setCreateUserName("瞿佳"); - } else if (order.getSupermarketId() == 5) { - model.setCreateUserId(65); - model.setCreateUserName("黄建阳"); - } else { - System.out.println("supermarket 错误 " + order.getSn()); - return false; - } + Map uid = new HashMap() {{ + put("陈宇", 302); + put("黄建阳", 65); + put("王乐", 64); + put("瞿佳", 29); + put("程兴", 102); + put("熊雄", 30); + put("祝天和", 235); + }}; + + model.setCreateUserId(uid.get(o.sqr)); + model.setCreateUserName(o.sqr); model.setInvoiceReceiveId(receive.getId()); model.setOrderSn(order.getSn()); model.setType(OrderTypeEnum.TEMP.getTypeid()); - model.setInvalidMemo("跟换票据"); + model.setInvalidMemo("更换票据"); model.setInvoiceNumber(order.getInvoiceNumber()); model.setInvoiceCode(order.getInvoiceCode()); - model.setVerifyUserId(48); - model.setVerifyUserName("王乐"); + model.setVerifyUserId(235); + model.setVerifyUserName("祝天和"); model.setMemo("同意更换"); model.setState(2); @@ -109,8 +245,8 @@ public class Main { InvoiceLog invoiceLog = InvoiceLog.dao.findFirst("select * from invoice_log t \n" + " where t.invoice_number = ? and t.code = ? limit 1 ", model.getInvoiceNumber(), model.getInvoiceCode()); - invoiceLog.setInvalidUserId(48); - invoiceLog.setInvalidUserName("王乐"); + invoiceLog.setInvalidUserId(235); + invoiceLog.setInvalidUserName("祝天和"); invoiceLog.setInvalidTime(now); invoiceLog.setInvalidMemo(model.getInvalidMemo()); invoiceLog.setState(OrderStateEnum.INVALID.getStateid()); @@ -119,11 +255,10 @@ public class Main { receive.setInvalidCount(receive.getInvalidCount() + 1); // 每次作废,作废数量加 1 - order.setInvoiceCode(null); - order.setInvoiceNumber(null); - order.setInvoiceSite(2); - order.setInvoiceType(2); - order.setTicketCode("21070309"); + order.setInvoiceCode(o.invoiceCode); + order.setInvoiceNumber(o.invoiceNumber); + order.setInvoiceSite(1); + order.setInvoiceType(1); synctask.addSaveData(model);