JRTWeb对Excel的支持

news2024/9/30 13:17:21

之前实现的是Excel的客户端导出模板协议,有的情况需要从Web直接把数据弄成Excel文件下载,或者有时候需要导入Excel数据进入系统,为此需要一个List得到Excel文件的封装和一个Excel文件得到Json串供界面做解析的方法。

测试效果,把查询的打印元素数据存入Excel文件,再用API读取Excel数据到二维Json数组
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试List转Excel和Excel得到json

import JRT.Core.MultiPlatform.JRTContext;
import JRT.Core.Util.ExcelUtil;
import JRT.Model.Entity.JRTPrintTemplateEle;
import JRTBLLBase.BaseHttpHandlerNoSession;

import java.io.File;
import java.io.FileInputStream;
import java.util.List;

/**
 * 测试Excel生成和读取json
 */
public class ashExcelTest  extends BaseHttpHandlerNoSession {
    /**
     * 测试Excel生成和读取json
     * @return
     * @throws Exception
     */
    public String Test() throws Exception
    {
        //查询打印元素数据
        List<JRTPrintTemplateEle> eleList=EntityManager().FindAllSimple(JRTPrintTemplateEle.class,null);
        String savePath=JRTContext.MapPath("../FileService/zlz.xlsx");
        //把数据导出成Excel到指定路径
        ExcelUtil.ListExportExcel(eleList,null, savePath);
        File file = new File(savePath);
        FileInputStream fileInputStream = new FileInputStream(file);
        String json=ExcelUtil.GetExcelJson(fileInputStream,".xlsx");
        return json;
    }
}

Excel工具类

package JRT.Core.Util;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Excel相关的工具类,list得到Excel文件或者Excel得到json串
 */
public class ExcelUtil {
    /**
     * 把列表数据导出成Excel文件
     *
     * @param datas
     * @param titleStr
     * @param savePath
     * @param <T>
     * @throws Exception
     */
    public static <T> void ListExportExcel(List<T> datas, List<String> titleStr, String savePath) throws Exception {
        InputStream stream = ListExportExcel(savePath, datas, titleStr);
        //创建输出流对象
        FileOutputStream output = null;
        if (stream != null) {
            File fi = new File(savePath);
            Path path = Paths.get(savePath).getParent();
            //没有父路径就创建
            if (!Files.exists(path)) {
                // 如果路径不存在,则创建路径
                Files.createDirectories(path);
            }
            try {
                int data;
                //创建输出流对象
                output = new FileOutputStream(savePath);
                while ((data = stream.read()) != -1) {
                    // 写入数据到目标位置
                    output.write(data);
                }

            } finally {
                if (stream != null) {
                    stream.close();
                }
                if (output != null) {
                    output.close();
                }
            }
        }
    }

    /**
     * 把列表数据得到Excel的文件流
     *
     * @param surffix  文件后缀.xlsx或.xls
     * @param datas
     * @param titleStr
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> InputStream ListExportExcel(String surffix, List<T> datas, List<String> titleStr) throws Exception {
        try {
            InputStream excelStream = null;
            Workbook hssfworkbook = null;
            if (surffix.indexOf(".xlsx") >= 0) {
                hssfworkbook = new SXSSFWorkbook(new XSSFWorkbook());
            }
            // 2003版本
            else if (surffix.indexOf(".xls") >= 0) {
                hssfworkbook = new XSSFWorkbook();
            } else {
                throw new Exception(surffix + "不是有效的Excel后缀!");
            }
            Sheet sheet = hssfworkbook.createSheet("表单1");
            Row row = null;
            int addIndex = 0;
            if (titleStr != null && titleStr.size() > 0) {
                row = sheet.createRow(0);
                //自动适应宽度
                //sheet.AutoSizeColumn(0);
                addIndex = 1;
                //遍历组装串
                for (int i = 0; i < titleStr.size(); i++) {
                    row.createCell(i).setCellValue(titleStr.get(i).replace("$r$n", ((char) (10)) + "" + ((char) (13))));
                }
            }
            if (datas != null && datas.size() > 0) {
                //提取属性列
                Class c = datas.get(0).getClass();
                Field[] filds = c.getFields();
                //遍历组装串
                for (int i = 0; i < datas.size(); i++) {
                    row = sheet.createRow(i + addIndex);
                    int index = 0;
                    T oneObj = datas.get(i);
                    //遍历属性的集合,创建DataTable
                    for (Field f : filds) {
                        row.createCell(index).setCellValue(ObjToString(f.get(oneObj)));
                        index++;
                    }
                }

            }
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            hssfworkbook.write(out);
            excelStream = new ByteArrayInputStream(out.toByteArray());
            out.close();
            hssfworkbook.close();
            return excelStream;
        } catch (Exception ex) {
            ex.printStackTrace();
            StringWriter stringWriter = new StringWriter();
            ex.printStackTrace(new PrintWriter(stringWriter));
            throw new Exception("往Excel写数据出错:" + stringWriter.toString());
        }
    }

    /**
     * 把Excel文件数据读取成json
     *
     * @param inputStream
     * @param surffix
     * @return
     * @throws Exception
     */
    public static String GetExcelJson(InputStream inputStream, String surffix) throws Exception {
        //存Json串
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        Workbook workbook = null;
        //2007版本
        if (surffix.indexOf(".xlsx") >= 0) {
            workbook = new XSSFWorkbook(inputStream);
        }
        //2003版本
        else if (surffix.indexOf(".xls") >= 0) {
            workbook = new XSSFWorkbook(inputStream);
        } else {
            throw new Exception(surffix + "不是有效的Excel后缀!");
        }
        //得到表单的个数
        int numSheets = workbook.getNumberOfSheets();
        int curSheetNum = 0;
        //遍历找到当前表单表单
        for (int i = 0; i < numSheets; i++) {
            String curName = workbook.getSheetAt(i).getSheetName();
            Sheet sheet = workbook.getSheet(curName);
            if (sheet == null) {
                continue;
            }
            //最后一列的标号
            int rowCount = sheet.getLastRowNum();
            if (rowCount == 0) {
                continue;
            }
            Row firstRow = sheet.getRow(0);
            if (curSheetNum == 0) {
                sb.append("[");
            } else {
                sb.append(",[");
            }
            curSheetNum++;
            //一行最后一个cell的编号 即总的列数
            int cellCount = 0;
            if (firstRow != null) {
                cellCount = firstRow.getLastCellNum();
            }
            int curRowNum = 0;
            for (int j = 0; j <= rowCount; j++) {
                Row curRow = sheet.getRow(j);
                if (curRow == null) {
                    continue;
                }
                if (firstRow == null) {
                    firstRow = curRow;
                    cellCount = firstRow.getLastCellNum();
                }
                if (curRowNum == 0) {
                    sb.append("{");
                } else {
                    sb.append(",{");
                }
                curRowNum++;
                int curCellNum = 0;
                for (int k = curRow.getFirstCellNum(); k < cellCount; k++) {
                    Cell cell = curRow.getCell(k);
                    if (cell == null) {
                        continue;
                    }
                    Object cellVal = null;
                    if (cell.getCellType() == CellType.NUMERIC) {
                        cellVal = cell.getNumericCellValue();
                    } else if (cell.getCellType() == CellType.STRING) {
                        cellVal = cell.getStringCellValue();
                    } else if (cell.getCellType() == CellType.BOOLEAN) {
                        cellVal = cell.getBooleanCellValue();
                    } else {
                        cellVal = "";
                    }
                    if (curCellNum == 0) {
                        sb.append("\"" + NumbertoString(k + 1) + "\":\"" + DealForJsonString(cellVal.toString()) + "\"");
                    } else {
                        sb.append(",\"" + NumbertoString(k + 1) + "\":\"" + DealForJsonString(cellVal.toString()) + "\"");
                    }
                    curCellNum++;
                }
                sb.append("}");
            }
            sb.append("]");
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * 处理json冲突符号
     *
     * @param str
     * @return
     */
    private static String DealForJsonString(String str) {
        if (str.isEmpty()) {
            return str;
        } else {
            return str.replace("\0", " ")
                    .replace("\\a", "\\a")
                    .replace("\b", "\\b")
                    .replace("\f", "\\f")
                    .replace("\t", "\\t")
                    .replace("\\v", "\\v")
                    .replace("\\", "\\\\")
                    .replace("\"", "\\\"")
                    .replace("\r", " ")
                    .replace("\n", " ");
        }
    }

    /**
     * 转换Excel列名
     *
     * @param colIndex
     * @return
     */
    private static String NumbertoString(int colIndex) {
        StringBuilder strResult = new StringBuilder();
        int once = colIndex / 26;
        int twice = colIndex % 26;
        strResult.append((char) (twice - 1 + 'A'));
        if (once > 26) {
            strResult.append(NumbertoString(once));
        } else if (once > 0) {
            strResult.append((char) (once - 1 + 'A'));
        }
        return strResult.toString();
    }


    /**
     * 保存文件
     *
     * @param fullName 全面
     * @param workbook 工作簿
     * @throws Exception
     */
    private static void Save(String fullName, Workbook workbook) throws Exception {
        File fi = new File(fullName);
        Path path = Paths.get(fullName).getParent();
        //没有父路径就创建
        if (!Files.exists(path)) {
            // 如果路径不存在,则创建路径
            Files.createDirectories(path);
        }
        FileOutputStream file = null;
        try {
            file = new FileOutputStream(fullName);
            // 把相应的Excel工作蒲存盘
            workbook.write(file);
        } finally {
            if (file != null) {
                file.close();
            }
        }
    }

    /**
     * 把对象转换成字符串
     *
     * @param obj
     * @return
     */
    private static String ObjToString(Object obj) {
        if (obj != null) {
            return obj.toString().replace("$r$n", ((char) (10)) + "" + ((char) (13)));
        }
        return "";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器托管在数据中心,如何有效避免中勒索病毒?

当服务器托管在数据中心时&#xff0c;安全措施需要更加严密&#xff0c;以确保服务器免受勒索病毒的攻击。 当服务器托管在数据中心时&#xff0c;安全措施需要更加严密&#xff0c;以确保服务器免受勒索病毒的攻击。以下是一些有效的策略和措施&#xff0c;帮助您降低风险&am…

Linux下的gcc与g++

文章目录 一.Linux gcc与g1.gcc如何生成可执行程序&#xff08;g同&#xff09;2.函数库 二.Linux项目自动化构建工具-make/makefile 一.Linux gcc与g 1.gcc如何生成可执行程序&#xff08;g同&#xff09; 预处理&#xff08;宏定义替换,展开头文件代码,条件编译,去注释&…

04-了解所有权

上一篇&#xff1a; 03-常用编程概念 所有权是 Rust 最独特的特性&#xff0c;对语言的其他部分有着深刻的影响。它使 Rust 可以在不需要垃圾回收器的情况下保证内存安全&#xff0c;因此了解所有权的工作原理非常重要。在本章中&#xff0c;我们将讨论所有权以及几个相关特性&…

BGV/BFV 的统一自举算法

参考文献&#xff1a; [GV23] Geelen R, Vercauteren F. Bootstrapping for BGV and BFV Revisited[J]. Journal of Cryptology, 2023, 36(2): 12.Bit Extraction and Bootstrapping for BGV/BFV 文章目录 Bootstrapping for BGV and BFVDecryption FunctionBGVBFV Bootstrapp…

初识汇编指令

1. ARM汇编指令 目的 认识汇编, 从而更好的进行C语言编程 RAM指令格式: 了解 4字节宽度 地址4字节对齐 方便寻址 1.1 指令码组成部分 : condition: 高4bit[31:28] 条件码 0-15 &#xff08;16个值 &#xff09; 条件码: 用于指令的 条件执行 , ARM指定绝大部分 都可…

Kubernetes/k8s之HPA,命名空间资源限制

Horizontal Pod Autoscaling:po的水平自动伸缩 这是k8s自带的模块 pod占用cpu比例达到一定的阀值&#xff0c;会触发伸缩机制。 根据cpu的阀值触发伸缩机制 replication controller 副本控制器 控制pod的副本数 deployment controller 节点控制器 部署pod hpa控制副本的数…

Android开发--状态栏布局隐藏的方法

1.问题如下&#xff0c;安卓布局很不协调 2.先将ActionBar设置为NoActionBar 先打开styles.xml 3.使用工具类 package com.afison.newfault.utils;import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graph…

【Elasticsearch篇】详解使用RestClient操作索引库的相关操作

文章目录 &#x1f354;什么是Elasticsearch&#x1f33a;什么是RestClient&#x1f386;代码操作⭐初始化RestClient⭐使用RestClient操作索引库⭐使用RestClient删除索引库⭐使用RestClient判断索引库是否存在 &#x1f354;什么是Elasticsearch Elasticsearch是一个开源的分…

【设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构】

文章目录 一、什么是LRU&#xff1f;二、LinkedHashMap 实现LRU缓存三、手写LRU 一、什么是LRU&#xff1f; LRU是Least Recently Used的缩写&#xff0c;意为最近最少使用。它是一种缓存淘汰策略&#xff0c;用于在缓存满时确定要被替换的数据块。LRU算法认为&#xff0c;最近…

MySQL两个表的亲密接触-连接查询的原理

MySQL对于被驱动表的关联字段没索引的关联查询&#xff0c;一般都会使用 BNL 算法。如果有索引一般选择 NLJ 算法&#xff0c;有 索引的情况下 NLJ 算法比 BNL算法性能更高。 关系型数据库还有一个重要的概念&#xff1a;Join&#xff08;连接&#xff09;。使用Join有好处&…

Ubuntu22.04报错:ValueError: the symlink /usr/bin/python3 does not point to ...

目录 一、背景 二、如何解决呢&#xff1f; 三、解决步骤 1. 确定可用的 Python 版本 2. 重新设置符号链接 3. 选择默认版本 4. 验证&#xff1a; 四、update-alternatives 详解 1. 命令语法 2. 常用选项 --install添加备选项。 --config&#xff1a;选择默认版本。 …

Linux系统常用命令行指令

Linux系统是一种常用于开源项目开发的生产环境&#xff0c;因其免费、开源、安全、稳定的特点被广泛应用于手机、平板电脑、路由器、电视和电子游戏机等嵌入式系统中&#xff0c;能够更加简便地让用户知道系统是怎样工作的。前几日我安装好了Red Hat Enterprise Linux 9.0&…

新书速览|小学生C++创意编程(视频教学版)

本书让入门C变得轻松易懂&#xff0c;逐步入学。学习一步一个台阶&#xff0c;让孩子不会被其中的难度而吓退。 本书内容 C是信息学奥赛指定的编程语言。本书以通俗易懂的方式深入浅出地介绍了C编程语言&#xff0c;适合作为小学生学习的教材类读物。 《小学生C创意编程&#…

uniapp css样式穿透

目录 前言css样式穿透方法不加css样式穿透的代码加css样式穿透的代码不加css样式穿透的代码 与 加css样式穿透的代码 的差别参考 前言 略 css样式穿透方法 使用 /deep/ 进行css样式穿透 不加css样式穿透的代码 <style>div {background-color: #ddd;} </style>…

opencv#33 边缘检测

边缘检测原理 图像的每一行每一列都可以看成是一个连续的信号经过离散后得到的数值&#xff0c;例如上图左侧给出的图像由黑色到白色的一个信号&#xff0c;也就是图像中某一行像素变化是由黑色逐渐到白色&#xff0c;我们将其对应在一个坐标轴中&#xff0c;将像素值的大小对应…

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…

Java基础数据结构之排序

一.排序 1.什么是稳定性 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持 不变&#xff0c;即在原序列中&#xff0c; r[i]r[j] &#xff0c;且 r[i] 在 r[j] 之前&#xff0c;而在排序后的序…

Oladance、韶音、南卡开放式耳机,究竟谁在性能与音质上达到巅峰?

​开放式耳机作为新型耳机&#xff0c;以其开放性设计、舒适性和音质表现受到用户青睐。然而&#xff0c;随着市场的繁荣&#xff0c;一些品牌为谋取暴利可能采用劣质材料、不合规的工艺标准制作产品&#xff0c;导致耳机做工质量差&#xff0c;音质差。作为资深音频测评师&…

C++入门语法———命名空间,缺省参数,重载函数

文章目录 一.命名空间1.存在意义2.语法使用1.定义命名空间2.使用命名空间的三种方式 二.缺省参数1.全缺省参数2.半缺省参数 三.重载函数1.定义2.重载原理———名字修饰 一.命名空间 1.存在意义 C命名空间的主要意义是为了避免命名冲突&#xff0c;尤其是在大型项目中可能存在…

图卷积网络(GCN)

本文主要分为两部分&#xff0c;第一部分介绍什么是GCN&#xff0c;第二部分将进行详细的数学推导。 一、什么是GCN 1、GCN 概述 本文讲的GCN 来源于论文&#xff1a;SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS&#xff0c;这是在GCN领域最经典的论文…