修改数据处理脚本,根据excel批量处理

dev
lisai 2022-11-27 23:33:07 +08:00
parent 77c8911c72
commit 7b4a49ef61
2 changed files with 395 additions and 30 deletions

View File

@ -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<CellRangeAddress> getCombineCell(Sheet sheet) {
List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();
//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<CellRangeAddress> 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;
}
/**
* 4sheet
*
* @param sheet sheet
* @return
*/
private static boolean hasMerged(Sheet sheet) {
int numMergedRegions = sheet.getNumMergedRegions();
if (numMergedRegions > 0) {
return true;
} else {
return false;
}
}
/**
* 5excel
*
* @param inputStream
* @return
*/
public static List<Object[]> importExcel(InputStream inputStream) {
//5.1、定义一个集合用来存储Object数据
List<Object[]> 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<CellRangeAddress> 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;
}
}

View File

@ -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<OrderTemp> 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<DOrder> orders = m.imp();
// List<OrderTemp> 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<DOrder> imp() throws ParseException {
String filepath = "C:\\Users\\lisai\\OneDrive\\文档\\黄砂经营管理\\浠水\\9月1日到11月7日补开普票统计.xlsx";
List<DOrder> 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<OrderTemp> 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<String, Integer> uid = new HashMap<String, Integer>() {{
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);