memorystream
今天遇到了 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;
}
文章最后发布于: 2017-10-28 16:06:51