关于修改压缩包内的文件(Excel...)内容的解决方法

news2025/3/3 4:15:10

关于修改压缩包内的文件(Excel…)内容的解决方法

前提:

💩 如果能在压缩前就修改完成就不需要修改压缩包内的文件

💩 如果能在压缩前就修改完成就不需要修改压缩包内的文件

💩 如果能在压缩前就修改完成就不需要修改压缩包内的文件

🌵 场景:

A接口的功能是将用户上传的Excel按指定的行列拆分成多个Excel。(同事写的,一时难以看懂)

记录会存到表中,同时拆分完成的多个Excel会被放入一个压缩文件中保存到某一路径。

压缩包供用户下载。

需求很简单:压缩包内的Excel设置自动列宽

  • 解决方法一:

在他的接口逻辑里直接在拆分后直接设置自动列宽…(不如直接让他改)

  • 解决方法二:

在他下载对应压缩包的接口中直接修改压缩包内的Excel文件,这种方法比较直接且好像可行。

开始

压缩包内的excel没有设置自动列宽,如图:

请添加图片描述

获取压缩包内的文件,设置自动列宽很简单,具体实现如下:

static void Main(string[] args)
    {
        string zipSavePath = @"E:\资料拆分\Zip14";


        string fileName = $@"TestZip";

		//打开目标压缩包
        using (var archive = ZipFile.Open($"{ zipSavePath }\\{ fileName }.zip", ZipArchiveMode.Update))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                Stream stream = entry.Open();
                XSSFWorkbook wb = new XSSFWorkbook(stream);

                ISheet sheet = wb.GetSheetAt(0);

                int col_num = 0;
                try
                {
                    while (sheet.GetRow(0).GetCell(col_num) != null)
                        col_num++;

                }
                catch (Exception e)
                {
                    // DoNothing
                }
			   //找到存在的列,设置自动宽度
                for (int i = 0; i <= col_num; i++)
                    sheet.AutoSizeColumn(i);


                MemoryStream ms = new MemoryStream();

                wb.Write(ms, true);

			   //保存后再把流塞回去
                using (Stream entryStream = entry.Open())
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    ms.CopyTo(entryStream);
                    ms.Close();
                }
            }
        }



        using FileStream fs = new FileStream($"{ zipSavePath }\\{ fileName }.zip", FileMode.Open, FileAccess.ReadWrite);

        byte[] buffer = new byte[fs.Length + 1];
        fs.Read(buffer, 0, (int)fs.Length);
    }
}

但这种方法会造成Excel文档损坏

请添加图片描述

虽然在Excel自动的修复后可以使用,但终究是不能使用这种方法的。

要避免这种情况,你必须新建压缩包,把Excel一个个修改后直接存在新的压缩包里,毕竟上面的代码改动后还是被流塞进了原来的文件,故会造成一些不知名的损坏。

改良代码:

static void Main(string[] args)
{
    string zipSavePath = @"E:\资料拆分\Zip14";


    string fileName = $@"TestZip";
	//防止多从调用创建重复文件
    File.Delete($@"{ zipSavePath }\\{ fileName + "back" }.zip"); 
    //创建新的压缩包
    ZipArchive NewZip = ZipFile.Open($@"{ zipSavePath }\\{ fileName + "back" }.zip",ZipArchiveMode.Create);

    using (var archive = ZipFile.Open($"{ zipSavePath }\\{ fileName }.zip", ZipArchiveMode.Update))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            Stream stream = entry.Open();
            XSSFWorkbook wb = new XSSFWorkbook(stream);

            ISheet sheet = wb.GetSheetAt(0);

            int col_num = 0;
            try
            {
                while (sheet.GetRow(0).GetCell(col_num) != null)
                    col_num++;

            }
            catch (Exception e)
            {
                // DoNothing
            }

            for (int i = 0; i <= col_num; i++)
                sheet.AutoSizeColumn(i);


            MemoryStream ms = new MemoryStream();

            wb.Write(ms, true);

            ZipArchiveEntry newNode = NewZip.CreateEntry(entry.Name);
            //将设置完成的Excel丢到新的压缩包内
            using (Stream entryStream = newNode.Open())
            {
                ms.Seek(0, SeekOrigin.Begin);
                ms.CopyTo(entryStream);
                ms.Close();
            }
        }
    }

	
    NewZip.Dispose();
    using FileStream fs = new FileStream($"{ zipSavePath }\\{ fileName+"back" }.zip", FileMode.Open, FileAccess.ReadWrite);



    byte[] buffer = new byte[fs.Length + 1];
    fs.Read(buffer, 0, (int)fs.Length);
}

请添加图片描述

如果在要在接口中返回压缩包则直接将新压缩包返回即可。

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

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

相关文章

通讯框架与Netty

一、网络通讯基础 1、OSI七层模型 2、一个域名底层是如何解析 浏览器访问域名&#xff0c;根据域名先从本地host文件C:\Windows\System32\drivers\etc\hosts文件 查找匹配对应的ip与域名&#xff0c;如果本地Host文件 没有的情况下&#xff0c;则联网去电信运营商查找。 3、什…

拉曼光谱的airPLS处理算法原理及MATLAB示例

一、拉曼光谱及airPLS算法 拉曼光谱被称作物质的“指纹谱”&#xff0c;能够表征分子的特征官能团&#xff0c;具有极高的特异性&#xff0c;在检测传感领域有极大的应用前景。但拉曼散射强度低&#xff0c;在实际的检测应用过程中还会受到噪声的影响。 为减少拉曼光谱中的…

程序员的“灵魂笔记本“:五款高效笔记软件推荐

大家好&#xff0c;我是 jonssonyan。作为一名程序员&#xff0c;我们经常需要记录和整理大量的代码、知识和项目信息&#xff0c;以便在日后能够高效地进行查阅和复用。而好用的笔记软件则成为了我们的"灵魂笔记本"&#xff0c;帮助我们提高工作效率。在这篇文章中&…

十一、存储技术基础

&#xff08;一&#xff09;独立磁盘冗余阵列RAID RAID级别 特点 需要磁盘 磁盘利用率 容错性 冗余性 热备盘选项 典型应用 RAID0 条带 2 全部 无 无 无 无故障的迅速读写&#xff0c;要求安全性不高&#xff0c;如图形工作站等 RAID1 镜像 2 50% 有 复制…

代码随想录_二叉树_leetcode112、113

leetcode112 路径总和 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返…

【血泪建议】软件测试岗位现状,可惜之前没人告诉我,肠子都晦青了....

谈到现状&#xff0c;国内的软件测试行情目前呈现了两极分化的极端情况。 一个是早期的手工测试人员吐槽工作不好做&#xff0c;即使有工作也是外包&#xff0c;而且薪资太低&#xff1b;一方面是很多互联网企业感叹自动化测试人才难找&#xff0c;有技术的自动化测试工程师&a…

Linux中执行命令

目录 一、命令格式 二、查看命令帮助 三、date命令 四、timedatectl命令 五、查看目录下的文件&#xff1a;ls&#xff08;list&#xff09; 一、命令格式 命令格式&#xff1a;主命令 选项 参数&#xff08;操作对象&#xff09; 命令分为两类&#xff1a; 内置命…

要刹车?生成式AI迎新规、行业连发ChatGPT“警报”、多国考虑严监管

4月13日消息&#xff0c;据中国移动通信联合会元宇宙产业工作委员会网站&#xff0c;中国移动通信联合会元宇宙产业工作委员会、中国通信工业协会区块链专业委员会等&#xff0c;共同发布“关于元宇宙生成式人工智能&#xff08;类 ChatGPT&#xff09;应用的行业提示”。提示内…

wmv格式的视频怎么转成mp4,4种方法简单易学

你知道wmv格式的视频怎么转成mp4吗&#xff1f;wmv和mp4都是视频文件格式&#xff0c;wmv格式是由微软开发的一种数字容器格式&#xff0c;它主要适用于电脑客户端。但由于其兼容性不佳&#xff0c;可能导致无法播放或出现错误。相比之下&#xff0c;mp4格式具有更广泛的兼容性…

Maven项目的JDK版本不一致引发的问题

1.运行提示java: 错误: 不支持发行版本 5&#xff08;改成JDK8&#xff09; 2.运行提示java&#xff1a;-source 8 中不支持 instanceof 中的模式匹配(改成JDK17) 解决方案&#xff08;以JDK8为例&#xff09; 1.普通Maven项目 通过指定Maven插件的JDK版本解决 <build>…

使用CentOS8实现Nginx负载均衡反向代理与安装MySQL数据库(涉及CentOS8、Nginx、MySQL、Flask)

文章目录1. 安装并配置CentOS8虚拟机1.1 安装1.2 设置静态IP(看需求不一定要设置)1.3 开启SSH\开启关闭端口\关闭开启防火墙1.4 虚拟机与本机互相复制粘贴、传输文件2. 如何在CentOS 8安装Python3. 解决错误&#xff1a;为 repo appstream 下载元数据失败4. 安装Nginx4.1 [关于…

Shader Graph8-输入Vector

一、三个向量 Vector叫做矢量或者向量&#xff0c;向量更偏向于数学&#xff0c;矢量更偏向于图形。下面三种Vector我们用的最多&#xff0c;红色叫Camera Vector相机向量、蓝色叫Surface Normal表面法线、黄色叫Light Vector光向量。 每个面都有法线&#xff0c;法线向量是这…

七大排序算法

文章目录1. 冒泡排序2. 插入排序3. 希尔排序4. 选择排序5. 堆排序6. 快速排序7. 归并排序1. 冒泡排序 从 0 号下标开始遍历&#xff0c;相邻两个数相互比较&#xff0c;如果左边的数大于右边的数&#xff0c;执行交换操作&#xff0c;最终每一趟冒泡都会将一个最大的数移到最右…

matplotlib使用

文章目录基本语法导入库plt 和ax.区别ax. 用法子图创建-展示不同的分区区域设置刻度范围&#xff1a;显示刻度设置刻度标签tick_params()函数添加轴坐标标签&#xff0c;表头&#xff0c;图例plt.用法普通折线图plt.plot(x,y,format_string,**kwargs)函数说明&#xff1a;中文显…

chapter-1数据管理技术的发展

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 数据管理技术的发展 发展三阶段 人工管理【1950前】 采用批处理&#xff1b;主要用于科学计算&#xff1b;外部设备只有磁带&#xff0c;卡片&#xff0c;纸带等 特点&#xff1a;1.数据面向应用2.数据不保…

python注释方式

计算机语言的注释基本都是一样的作用 一个是 我这段代码可能之后还要用 但现在没用 我先注释在这里 他不会参与运行 但我想用了 直接打开注释 他就正常运行了 还要就是 用 注释 解释你代码的作用 方法呢 单行注释 以警号开头 右侧内容即为注释 print(666) print(130.33) #pr…

STM32之增量式编码器电机测速

STM32之增量式编码器电机测速编码器编码器种类按监测原理分类光电编码器霍尔编码器按输出信号分类增量式编码器绝对式编码器编码器参数分辨率精度最大响应频率信号输出形式编码器倍频STM32的编码器模式编码器模式编码器的计数方向仅在TI1计数电机正转&#xff0c;向上计数。电机…

卷麻了,00后测试用例写的比我还好,简直无地自容.....

前言 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很头疼&#xff0c;无法接触需求&#xff0c;只能根据站在用户的角度去做测试&#xff0c;但是这样情况会导致不能全方位的测试APP&#xff0c;这种情况就需要一份测试用例了&#xff0c;但是不…

服务(第五篇)Nginx!!!

Nginx和Apache的差异? Nginx是一个基于事件的Web服务器&#xff0c;Apache是一个基于流程的Web服务器; Nginx所有请求都由一个线程处理&#xff0c;Apache单个线程处理单个请求; Nginx异步非阻塞的&#xff0c;Apache是阻塞的; Nginx在内存消耗和连接方面更好&#xff0c;Apa…

【JAVA】#详细介绍!!! synchronized 加锁 详解(2)

本篇主要是针对 synchronized锁的优化过程来介绍&#xff0c;针对synchronized的加锁优化过程来了解上篇所提到的synchronized的锁特性。 目录 1. synchronized锁的特性 2.synchronized 锁的升级过程 2.1 总过程&#xff1a; 2.2 偏向锁 2.3 轻量级锁 2.3.1自旋锁vs自适应…