Dbf工具类

chatgpt/2023/10/4 7:29:49

Dbf工具类

配置环境

	<!--itxt--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;import com.enlistboot.common.exception.ServiceException;
import org.apache.commons.compress.utils.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;import com.enlistboot.common.annotation.Dbf;
import com.linuxense.javadbf.DBFDataType;
import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFReader;
import com.linuxense.javadbf.DBFWriter;public class DBFUtils<E> {private static final Logger log = LoggerFactory.getLogger(DBFUtils.class);static Map<String, Object> CONVERTER_EXP_MAP = new HashMap<>(16);public DBFUtils() {}/*** 导入DBF* * @param request* @param fileParamName* @throws ServletException* @throws IOException*/public static void importDBF(HttpServletRequest request, String fileParamName)throws ServletException, IOException {Part filePart = request.getPart(fileParamName);String fileName = getFileName(filePart);// 将文件保存到临时目录String tempPath = System.getProperty("java.io.tmpdir");String filePath = tempPath + File.separator + fileName;saveFile(filePart, filePath);// 导入DBF数据// importData(filePath);// 删除文件deleteTempFile(tempPath);}private static String getFileName(Part part) {String contentDisposition = part.getHeader("content-disposition");String[] parts = contentDisposition.split(";");for (String item : parts) {if (item.trim().startsWith("filename")) {return item.substring(item.indexOf('=') + 1).trim().replace("\"", "");}}return null;}private static void deleteTempFile(String filePath) {File file = new File(filePath);if (file.exists()) {file.delete();}}private static void saveFile(Part part, String filePath) throws IOException {try (InputStream inputStream = part.getInputStream();OutputStream outputStream = new FileOutputStream(filePath)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}}}public List<E> importData(InputStream fis, Class<E> cls) throws IOException {
//    Charset charset = Charset.forName("GBK");
//    Charset charset = Charset.forName("UTF8");DBFReader reader = new DBFReader(fis, Charset.forName("GBK"));// 调用DBFReader对实例方法得到path文件中字段的个数int fieldsCount = reader.getFieldCount();// 判断是否包含指定的字段List<Field> classFields = Arrays.asList(cls.getDeclaredFields());// 取出字段信息for (int i = 0; i < fieldsCount; i++) {DBFField field = reader.getField(i);System.out.println(field.getName());boolean containsField = classFields.stream().anyMatch(f -> f.getName().equals(field.getName()));if(!containsField){throw new ServiceException("导入文件列名:"+field.getName()+"不存在");}}Object[] rowValues;// 一条条取出path文件中记录List<E> dataList = Lists.newArrayList();while ((rowValues = reader.nextRecord()) != null) {E e = null;try {e = (E) cls.newInstance();} catch (Exception e8) {}for (int i = 0; i < rowValues.length; i++) {DBFField field = reader.getField(i);Object object = rowValues[i];System.out.println(i + "-------" + object + "--------" + field.getName());String val = "";if (StringUtils.isNotNull(object)) {val = object.toString();}Reflections.invokeSetter(e, field.getName(), val);}dataList.add(e);}return dataList;}public static <T> void exportToDbf(HttpServletResponse response, Class<?> clazz, List<T> dataList,String fileName) {try {response.setContentType("application/x-dbf;");response.setCharacterEncoding("UTF-8");response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName + ".dbf", "UTF-8"));// 获取字段数量和记录数量int numFields = getNumFields(clazz);int numRecords = dataList.size();// 读取内容转表达式中的值
//            setFieldValue(dataList);// 创建一个包含字段信息的 DBFField 数组DBFField[] fields = getFields(clazz);// 创建一个 DBFWriter 对象,用于写入 DBF 文件
//            DBFWriter writer = new DBFWriter(response.getOutputStream(), Charset.forName("GBK"));DBFWriter writer = new DBFWriter(response.getOutputStream(), Charset.forName("GBK"));writer.setFields(fields);if (!CollectionUtils.isEmpty(dataList)) {// 将每个 Person 对象的属性值写入到 DBF 文件中for (int i = 0; i < numRecords; i++) {Object[] record = new Object[numFields];T obj = dataList.get(i);for (int j = 0; j < numFields; j++) {record[j] = getFieldValue(obj, j);}writer.addRecord(record);}}// 关闭 DBFWriter 对象writer.close();} catch (Exception e) {
//           log.error(e.getMessage());throw new RuntimeException(e.getMessage(), e);}}private static <T> int getNumFields(Class<?> clazz) {Field[] fields = clazz.getDeclaredFields();int count = 0;for (Field field : fields) {if (field.isAnnotationPresent(Dbf.class)) {count++;}}return count;}private static <T> DBFField[] getFields(Class<?> clazz) {Field[] fields = clazz.getDeclaredFields();int numFields = getNumFields(clazz);if (numFields < 0) {numFields = 0;}DBFField[] resultFields = new DBFField[numFields];int index = 0;boolean flag=false;for (Field field : fields) {if (field.isAnnotationPresent(Dbf.class)) {Dbf fieldNameAnnotation = field.getAnnotation(Dbf.class);int fieldIndex = fieldNameAnnotation.order();if (fieldIndex == 0) {flag=true;}if(flag){fieldIndex = index;}String fieldName = fieldNameAnnotation.name();if (fieldName.length() > 10) {fieldName = fieldName.substring(0, 10);}DBFDataType fieldType = DBFDataType.CHARACTER;if (field.getType() == int.class || field.getType() == Integer.class) {fieldType = DBFDataType.NUMERIC;} else if (field.getType() == double.class || field.getType() == Double.class) {fieldType = DBFDataType.FLOATING_POINT;}resultFields[fieldIndex] = new DBFField(fieldName, fieldType, 20); // 字段类型设置为CHARACTER,长度为10个字符index++;}}return resultFields;}public static <T> void setFieldValue(List<T> dataList) {try {for (T t : dataList) {if (!ObjectUtils.isEmpty(t)) {Field[] fields = t.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Dbf.class)) {Dbf fieldNameAnnotation = field.getAnnotation(Dbf.class);String converterExp = fieldNameAnnotation.readConverterExp();if (StringUtils.isNotEmpty(converterExp)) {field.setAccessible(true);// 读取转换值if (!ObjectUtils.isEmpty(t)) {field.set(t, parseConverterExp(field.get(t), converterExp));}}}}}}} catch (IllegalAccessException e) {e.printStackTrace();}}private static Object parseConverterExp(Object o, String converterExp) {CONVERTER_EXP_MAP = Arrays.stream(converterExp.split(",")).map(s -> s.split("=")).filter(arr -> arr.length == 2).collect(Collectors.toMap(arr -> arr[0], arr -> arr[1]));return CONVERTER_EXP_MAP.get(o);}private static <T> Object getFieldValue(T obj, int index) {if (ObjectUtils.isEmpty(obj)) {return null;}Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Dbf.class)) {Dbf fieldNameAnnotation = field.getAnnotation(Dbf.class);int fieldIndex = fieldNameAnnotation.order();if (fieldIndex == index) {try {field.setAccessible(true);return field.get(obj);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}}return null;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5314229.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu Server版 之 apache系列 安装、重启、开启,版本查看

安装之前首先要检测是否安装过 apt list --installed | grep tool tool&#xff1a;要检测的名称&#xff0c;如mysql、apache 、ngnix 等 安装 apache sudo apt install apache2 安装apache 默认是开启的 可以通过浏览器 检测一下 service apache stop # apache 停止服务…

【Spring】Spring之循环依赖底层源码解析

什么是循环依赖 A依赖了B&#xff0c;B依赖了A。 示例&#xff1a; // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }其实&#xff0c;循环依赖并不是问题&#xff0c;因为对象之间相互依赖是很正常的事情。示例&#xff1a; A a new A(); B b new B…

芯片制造详解.刻蚀原理.学习笔记(五)

本篇笔记是看完原视频后的整理和补充&#xff0c;建议各位观看原视频&#xff0c;这里附上地址。 如何雕刻芯片&#xff1a;刻蚀原理&#xff5c;芯片制造详解05 芯片制造详解.刻蚀原理.学习笔记 五 一、刻蚀技术的分类二、刻蚀中三个关键指标2.1 刻蚀速率2.2 选择比2.3 方向性…

使用python重命名指定目录文件

使用python重命名指定目录文件 1. [文件] 指定目录文件重命名 ~ 715B #Copyright 2012 wuyuangui.#www.iplaypy.com python教程import ospath F:\Python\open project\SGI\SGI_STL paths path.replace(\\, //) paths paths // print paths files os.listdir(paths) for i …

图像 检测 - FCOS: Fully Convolutional One-Stage Object Detection (ICCV 2019)

FCOS: Fully Convolutional One-Stage Object Detection - 全卷积一阶段目标检测&#xff08;ICCV 2019&#xff09; 摘要1. 引言2. 相关工作3. 我们的方法3.1 全卷积一阶目标检测器3.2 FCOS的FPN多级预测3.3 FCOS中心度 4. 实验4.1 消融研究4.1.1 FPN多级预测4.1.2 有无中心度…

有点慌,新公司项目构建用的Gradle

入职新公司&#xff0c;构建项目的工具用的gradle&#xff0c;以前没用过&#xff0c;看到一个build.gradle&#xff0c;点进去&#xff0c;心里一句我曹&#xff0c;这写的都是些什么玩意&#xff0c;方得一批&#xff0c;赶紧去补了下课。 好吧&#xff0c;先学点语法&#…

数据结构:第六章 图

文章目录 一、图的基本概念1.1定义1.2有向图、无向图1.3顶点的度、入度、出度1.4顶点-顶点关系的描述1.5子图和生成子图1.6连通分量1.6强连通分量1.7生成树1.8生成森林1.9边的权、带权图/网1.10几种特殊的图1.11小结 二、图的存储及基本操作2.1邻接矩阵法2.1.1邻接矩阵存储不带…

Vue没有node_modules怎么办

npm install 一下 然后再npm run serve 就可以运行了
推荐文章