MemoryStream导出 Excel文件

简介: 今天遇到了 MemoryStream这个 流操作 百度了一下 简单区别了一下和FileStream的区别: 简单介绍一下MemoryStreamMemoryStream是内存流,为系统内存提供读写操作,由于Memo...

今天遇到了 MemoryStream这个 流操作
百度了一下 简单区别了一下和FileStream的区别:
简单介绍一下MemoryStream

MemoryStream是内存流,为系统内存提供读写操作,由于MemoryStream是通过无符号字节数组组成的,可以说MemoryStream的性能可以

算比较出色,所以它担当起了一些其他流进行数据交换时的中间工作,同时可降低应用程序中对临时缓冲区和临时文件的需要,其实MemoryStream

的重要性不亚于FileStream,在很多场合我们必须使用它来提高性能

MemoryStream和FileStream的区别

前文中也提到了,FileStream主要对文件的一系列操作,属于比较高层的操作,但是MemoryStream却很不一样,它更趋向于底层内存的操作,这样

能够达到更快的速度和性能,也是他们的根本区别,很多时候,操作文件都需要MemoryStream来实际进行读写,最后放入到相应的FileStream中,

不仅如此,在诸如XmlWriter的操作中也需要使用到MemoryStream提高读写速度

于是 我就举个给大家 也是比较常用的 就是MemoryStream导出 Excel文件

filestream需要头文件system.IO;
主要代码是:
SaveFileDialog save = new SaveFileDialog();
save.Filter = “EXCEL|*.xls”;
if (save.ShowDialog() == DialogResult.OK)
{
save.RestoreDirectory = true;
string fileName = save.FileName;
DataTable table = dy.copy(); //dy是table类型且有内容的表
saveTofle(RenderToExcel(table, “sdf”), fileName);

            }   //RenderToExcel(table, "sdf")返回的是MemoryStream类型


    private void saveTofle(MemoryStream file,string fileName)
    {
        using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
        {
            byte[] buffer = file.ToArray();//转化为byte格式存储
            fs.Write(buffer, 0, buffer.Length);
            fs.Flush();
            buffer = null;
        }//使用using可以最后不用关闭fs 比较方便
    }
    接下里就是RenderToExcel函数   
    需要头文件
    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    代码是:


            public static MemoryStream RenderToExcel(DataTable table, string sheetName)
    {
        //table.Columns.Remove("docid");
        table.Columns.Remove("医院编号");
        table.Columns.Remove("科室编号");
        table.Columns.Remove("药品编号");
        MemoryStream ms = new MemoryStream();
            using (IWorkbook workbook = new HSSFWorkbook())//创建WorkBook对象
            {
                using (ISheet sheet = workbook.CreateSheet(sheetName))//获取WorkBook对象的第一个工作表
                {
                    HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
                    headStyle.BorderBottom = CellBorderType.THIN;
                    headStyle.BorderLeft = CellBorderType.THIN;
                    headStyle.BorderRight = CellBorderType.THIN;
                    headStyle.BorderTop = CellBorderType.THIN;//这是表格样式设置
                    #region 创建了第一个列标题的行
                    IRow headerRow = sheet.CreateRow(0);// handling header.创造一行
                    int flag = 0;

                    foreach (DataColumn column in table.Columns)
                    {
                        if (column.ColumnName != "医生编号")   //ColumnName是该列的名称
                        {

                            headerRow.CreateCell(column.Ordinal - flag).SetCellValue(column.Caption);   //Caption是该列的标题
                        }
                        else
                        {
                            flag++;
                        }
                    }
                    #endregion
                    int rowIndex = 1;  //新的行移动到下一列

                    decimal sm = new decimal(0);

                    for (int i = 0; i < table.Rows.Count - 1; i++)
                    {
                        IRow dataRow = sheet.CreateRow(rowIndex);
                        flag = 0;
                        #region 行的医生和下一行的医生不一样的时候分组
                        if (table.Rows[i]["医生编号"].ToString() != table.Rows[i + 1]["医生编号"].ToString() && table.Rows[i]["医生姓名"].ToString() != table.Rows[i + 1]["医生姓名"].ToString())
                        {
                            sm += Convert.ToDecimal(table.Rows[i]["药品总价"]);  //得相加   而不是赋值
                            foreach (DataColumn column in table.Columns)
                            {
                                if (column.ColumnName != "医生编号")
                                {
                                    if (table.Rows[i][column.Ordinal].GetType().Name == "Int32")
                                    {
                                        dataRow.CreateCell(column.Ordinal - flag).SetCellValue(Convert.ToDouble(table.Rows[i][column.Ordinal].ToString()));
                                    }
                                    else
                                    {
                                        dataRow.CreateCell(column.Ordinal - flag).SetCellValue(table.Rows[i][column.Ordinal].ToString());
                                    }

                                }
                                else
                                {
                                    flag++;
                                }

                            }
                            rowIndex++;
                            IRow Row = sheet.CreateRow(rowIndex);
                            Row.CreateCell(table.Columns.Count - 2 - flag).SetCellValue("      合计:");
                            Row.CreateCell(table.Columns.Count - 1 - flag).SetCellValue(Convert.ToDouble(sm));

                            rowIndex++;
                            IRow Rw = sheet.CreateRow(rowIndex);

                            rowIndex++;
                            IRow R = sheet.CreateRow(rowIndex);

                            rowIndex++;
                            IRow head = sheet.CreateRow(rowIndex);
                            flag = 0;
                            if (!String.IsNullOrEmpty(table.Rows[i + 1][2].ToString()))
                            {
                                foreach (DataColumn column in table.Columns)
                                {
                                    if (column.ColumnName != "医生编号")
                                    {
                                        head.CreateCell(column.Ordinal - flag).SetCellValue(column.Caption);

                                    }
                                    else
                                    {
                                        flag++;
                                    }
                                }

                                rowIndex++;
                            }
                            sm = new decimal(0);
                        }
                        #endregion
                        #region 行的医生和下一行的医生相等时同一组
                        else
                        {
                            foreach (DataColumn column in table.Columns)
                            {
                                if (column.ColumnName != "医生编号")
                                {
                                    if (table.Rows[i][column.Ordinal].GetType().Name == "Int32")
                                    {
                                        dataRow.CreateCell(column.Ordinal - flag).SetCellValue(Convert.ToDouble(table.Rows[i][column].ToString()));

                                    }
                                    else
                                    {
                                        dataRow.CreateCell(column.Ordinal - flag).SetCellValue(table.Rows[i][column].ToString());
                                    }
                                    //dataRow.GetCell(column.Ordinal - flag).CellStyle = headStyle;
                                }
                                else
                                {
                                    flag++;
                                }
                            }
                            rowIndex++;
                            sm += Convert.ToDecimal(table.Rows[i]["药品总价"]);
                        }

                    #endregion
                    }
                    workbook.Write(ms);
                    ms.Flush();
                    ms.Position = 0;//流位置归零
                }
            }
        return ms;
    }
目录
相关文章
|
3月前
|
Python
Excel中如何批量重命名工作表与将每个工作表导出到单独Excel文件
本文介绍了如何在Excel中使用VBA批量重命名工作表、根据单元格内容修改颜色,以及将工作表导出为独立文件的方法。同时提供了Python实现导出工作表的代码示例,适用于自动化处理Excel文档。
|
5月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
199 10
|
4月前
|
Java 测试技术 数据库
spring号码归属地批量查询,批量查询号码归属地,在线工具,可按省份城市运营商号段分类分开分别导出excel表格
简介:文章探讨Spring Boot项目启动优化策略,通过自定义监听器、异步初始化及分库分表加载优化等手段,将项目启动时间从280秒缩短至159秒,提升约50%,显著提高开发效率。
|
10月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
2160 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
8月前
|
文字识别 Serverless 开发工具
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
920 5
|
10月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
179 6
按条件将Excel文件拆分到不同的工作表
|
10月前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
272 6
|
10月前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
285 6
|
11月前
|
数据格式 UED
记录一次NPOI库导出Excel遇到的小问题解决方案
【11月更文挑战第16天】本文记录了使用 NPOI 库导出 Excel 过程中遇到的三个主要问题及其解决方案:单元格数据格式错误、日期格式不正确以及合并单元格边框缺失。通过自定义单元格样式、设置数据格式和手动添加边框,有效解决了这些问题,提升了导出文件的质量和用户体验。
855 3
|
11月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
213 1