ExcelUtils导入excel,自动对负数金额格式化的问题

server/2024/12/22 22:54:51/

大坑

今日开发中遇到一个问题,使用ExcelUtils导入excelexcel中有一列为金额字段,有负数 ,例如-2.94,发现在导入后被自动转换为了-3.00,只有负数会这样

负数会进行以下操作

(new DecimalFormat("0")).format(o)

解决方案:

1.手写ExcelUtils

java">package com.chinaums.common.utils.sql;import com.chinaums.common.annotation.Excel;
import com.chinaums.tools.DateUtils;
import com.chinaums.tools.StringUtils;
import com.chinaums.tools.converter.Convert;
import com.chinaums.tools.reflect.ReflectUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;import static com.chinaums.tools.poi.ExcelUtils.reverseByExp;/*** Bean 工具类*/
public class ExcelUtils<T> {private static final Logger log = LoggerFactory.getLogger(com.chinaums.tools.poi.ExcelUtils.class);public static final int sheetSize = 65536;private String sheetName;private Excel.Type type;private Workbook wb;private Sheet sheet;private List<T> list;private List<Object[]> fields;public final Class<T> clazz;public ExcelUtils(Class<T> clazz) {this.clazz = clazz;}public List<T> importExcel(String sheetName, InputStream is) throws Exception {this.type = Excel.Type.IMPORT;this.wb = WorkbookFactory.create(is);List<T> list = new ArrayList();Sheet sheet;if (StringUtils.isNotEmpty(sheetName)) {sheet = this.wb.getSheet(sheetName);} else {sheet = this.wb.getSheetAt(0);}if (sheet == null) {throw new IOException("文件sheet不存在");} else {int rows = sheet.getPhysicalNumberOfRows();if (rows > 0) {Map<String, Integer> cellMap = new HashMap();Row heard = sheet.getRow(0);for (int i = 0; i < heard.getPhysicalNumberOfCells(); ++i) {String value = this.getCellValue(heard, i).toString();cellMap.put(value, i);}Field[] allFields = this.clazz.getDeclaredFields();Map<Integer, Field> fieldsMap = new HashMap();Field[] var10 = allFields;int var11 = allFields.length;for (int var12 = 0; var12 < var11; ++var12) {Field field = var10[var12];Excel attr = (Excel) field.getAnnotation(Excel.class);if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == this.type)) {field.setAccessible(true);Integer column = (Integer) cellMap.get(attr.name());fieldsMap.put(column, field);}}for (int i = 1; i < rows; ++i) {Row row = sheet.getRow(i);T entity = null;Iterator var25 = fieldsMap.entrySet().iterator();while (var25.hasNext()) {Map.Entry<Integer, Field> entry = (Map.Entry) var25.next();Object val = this.getCellValue(row, (Integer) entry.getKey());entity = entity == null ? this.clazz.newInstance() : entity;Field field = (Field) fieldsMap.get(entry.getKey());Class<?> fieldType = field.getType();if (String.class == fieldType) {String s = Convert.toStr(val);if (StringUtils.endsWith(s, ".0")) {val = StringUtils.substringBefore(s, ".0");} else {val = Convert.toStr(val);}} else if (Integer.TYPE != fieldType && Integer.class != fieldType) {if (Long.TYPE != fieldType && Long.class != fieldType) {if (Double.TYPE != fieldType && Double.class != fieldType) {if (Float.TYPE != fieldType && Float.class != fieldType) {if (BigDecimal.class == fieldType) {val = Convert.toBigDecimal(val);} else if (Date.class == fieldType) {if (val instanceof String) {val = DateUtils.parseDate(val);} else if (val instanceof Double) {val = DateUtil.getJavaDate((Double) val);}}} else {val = Convert.toFloat(val);}} else {val = Convert.toDouble(val);}} else {val = Convert.toLong(val);}} else {val = Convert.toInt(val);}if (StringUtils.isNotNull(fieldType)) {Excel attr = (Excel) field.getAnnotation(Excel.class);String propertyName = field.getName();if (StringUtils.isNotEmpty(attr.targetAttr())) {propertyName = field.getName() + "." + attr.targetAttr();} else if (StringUtils.isNotEmpty(attr.readConverterExp())) {val = reverseByExp(String.valueOf(val), attr.readConverterExp());}ReflectUtils.invokeSetter(entity, propertyName, val);}}list.add(entity);}}return list;}}public Object getCellValue(Row row, int column) {if (row == null) {return null;} else {Object val = "";try {Cell cell = row.getCell(column);if (cell != null) {if (cell.getCellTypeEnum() != CellType.NUMERIC && cell.getCellTypeEnum() != CellType.FORMULA) {if (cell.getCellTypeEnum() == CellType.STRING) {val = cell.getStringCellValue();} else if (cell.getCellTypeEnum() == CellType.BOOLEAN) {val = cell.getBooleanCellValue();} else if (cell.getCellTypeEnum() == CellType.ERROR) {val = cell.getErrorCellValue();}} else {val = cell.getNumericCellValue();if (HSSFDateUtil.isCellDateFormatted(cell)) {val = DateUtil.getJavaDate((Double) val);} else if ((Double) val % 1.0 > 0.0) {val = (new DecimalFormat("0.00")).format(val);}}}return val;} catch (Exception var5) {return val;}}}
}

2.优化getCellValue方法 使其不对负数金额进行处理,原样返回

3.最后附上 导入excel代码

java"> public R elmImport(MultipartFile multipartFile) {//1、文件上传fileInfoService.uploadFile(1, 1, null, "", userId, Constants.OTHERS, multipartFile);//2、excel文件读取ExcelUtils<ElmImportVo> excelUtils = new ExcelUtils<>(ElmImportVo.class);//待存储数量List<RealTransInfoEntity> waitSaveList = new ArrayList<>();List<ElmImportVo> elmList;//3、读取校验excel信息try {elmList = excelUtils.importExcel("账单明细", multipartFile.getInputStream());} catch (Exception e) {e.printStackTrace();throw new ServiceException("--------导入失败---------");}
}


http://www.ppmy.cn/server/105297.html

相关文章

mysql在字符串列建立索引示例

目录 一、示例1. 创建表时建立索引2. 在已存在的表上添加索引 二、注意事项 在MySQL中&#xff0c;对字符串列建立索引是一种常见做法&#xff0c;用以提高基于该列的查询性能。下面我将通过一个示例来说明如何在字符串列上建立索引。 一、示例 假设我们有一个名为users的表&a…

【TS】5 在React中使用TS

前言 目标 掌握如何创建TS项目TS配置文件tsconfig.json了解React中的常用类型#mermaid-svg-4Mm4hDCA1S7AuCt7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Mm4hDCA1S7AuCt7 .error-icon{fill:#552222;}#mermaid…

47.x86游戏实战-VEHHOOK封包函数

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

python下载b站视频

python下载b站视频源码参考 import time import requests import json import re from lxml import etree from moviepy.editor import *def merge_video_audio(video_path, audio_path):print(原始视频音频合并中&#xff0c;请耐心等待~)# 获取下载好的音频和视频文件vd Vi…

用 postman 的时候如何区分服务器还是自己的问题?

“首先&#xff0c;可以通过请求的目标地址来判断。如果目标地址是已知的服务器地址&#xff0c;那很可能是在与服务器进行交互。而如果目标地址指向本地的特定端口或 IP 地址&#xff0c;比如 127.0.0.1 或 localhost&#xff0c;那就可能是在测试本地的服务。 其次&#xff…

08 内置函数

目录 日期函数字符串函数数学函数其他函数 1. 日期函数 函数名称描述current_date&#xff08;&#xff09;当前日期current_time&#xff08;&#xff09;当前时间current_timestamp&#xff08;&#xff09;当前时间戳date(datetime)返回datetime参数的日期部分date_add(da…

Maven

Maven 1.maven能解决啥问题&#xff1f; 1.1第三方jar包 在今天的 JavaEE 开发领域&#xff0c;有大量的第三方框架和工具可以供我们使用。要使用这些 jar 包最简单 的方法就是复制粘贴到 WEB-INF/lib 目录下。但是这会导致每次创建一个新的工程就需要将 jar 包重复制到 lib…

关于Ubuntu20.04无法连接、识别蓝牙设备;开机启动界面报错:Bluetooth:hci0:Failed等问题的解决

背景&#xff1a;我的ubuntu2004无法识别到蓝牙设备&#xff0c;如下图&#xff1a;解决前&#xff1a;红框内无论蓝牙是否打开&#xff0c;都无法显示相关设备&#xff0c;在这里记录一下解决问题的过程。 Ubuntu菜单栏一直有蓝牙图标&#xff0c;突然蓝牙图标消失了&#xff…