MemoryStream导出 Excel文件

今天遇到了 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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值