/// <summary>
/// 出力Excel
/// </summary>
/// <param name="storeModelForExcel"></param>
public void GenerateExcel(List<ExcelModel> excelModelList,string savePath)
{
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
if (excel == null)
{
return;
}
//设置为不可见,操作在后台执行,为 true 的话会打开 Excel
excel.Visible = false;
//打开时设置为全屏显式
//excel.DisplayFullScreen = true;
//初始化工作簿
Microsoft.Office.Interop.Excel.Workbooks workbooks = excel.Workbooks;
//新增加一个工作簿,Add()方法也可以直接传入参数 true
Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
var tt = workbook.Worksheets.Count;
try
{
for (int sheetNum = ; sheetNum < excelModelList.Count; sheetNum++)
{
Microsoft.Office.Interop.Excel.Range range;
for (int k = ; k < tt; k++)
{
//设置表的名称
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[k + ];
worksheet.Name = excelModelList[sheetNum].dt.TableName;
range = worksheet.get_Range("A1", System.Reflection.Missing.Value);
range.NumberFormat = "@";
range = range.get_Resize(excelModelList[sheetNum].dt.Rows.Count + , excelModelList[sheetNum].dt.Columns.Count);
string[,] saRet = new string[excelModelList[sheetNum].dt.Rows.Count + , excelModelList[sheetNum].dt.Columns.Count];
//设置列名
for (int i = ; i < excelModelList[sheetNum].dt.Columns.Count; i++)
{
//设置第一行,即列名
saRet[, i] = excelModelList[sheetNum].dt.Columns[i].ColumnName;
}
//跳过第一行,第一行写入了列名
int rowIndex = ;
//写入数据
for (int i = ; i < excelModelList[sheetNum].dt.Rows.Count; i++)
{
for (int j = ; j < excelModelList[sheetNum].dt.Columns.Count; j++)
{
saRet[rowIndex + i, j] = excelModelList[sheetNum].dt.Rows[i][j].ToString();
}
}
range.set_Value(System.Reflection.Missing.Value, saRet);
//设置所有列宽为自动列宽
//worksheet.Columns.AutoFit();
//设置所有单元格列宽为自动列宽
worksheet.Cells.Columns.AutoFit();
}
//新增加一个 Excel 表(sheet)
if (sheetNum < excelModelList.Count - )
{
workbook.Worksheets.Add();
}
}
//是否提示,如果想删除某个sheet页,首先要将此项设为fasle。
excel.DisplayAlerts = false;
//保存写入的数据,这里还没有保存到磁盘
workbook.Saved = true;
////创建文件
FileStream file = new FileStream(savePath, FileMode.CreateNew);
//关闭释放流,不然没办法写入数据
file.Close();
file.Dispose();
////保存到指定的路径
workbook.SaveCopyAs(savePath);
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
excel.Quit();
//关闭进程,防止启动多个,导致内存溢出
IntPtr t = new IntPtr(excel.Hwnd);
int processId = ;
GetWindowThreadProcessId(t, out processId);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(processId);
p.Kill();
}
catch (Exception e)
{
throw e;
}
} [DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);

注意:数据先写到内存saRet,在一次性写进sheet

range.set_Value(System.Reflection.Missing.Value, saRet);

C# 往excel出力数据的更多相关文章

  1. NPOI操作EXCEL(三)——反射机制进行excel表格数据的解析

    我们先来回忆回忆上篇文章讲到的通过xml配置文件实现excel批量模板解析的整体思路: 1.对每个excel模板制定xml配置规则集,实现xml配置文件的解析服务 2.为每个excel模板制定DTO, ...

  2. .net实现与excel的数据交互、导入导出

    应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...

  3. jxl读取Excel表格数据

    调用jxl包实现Excel表格数据的读取,代码如下: import java.io.File; import java.io.IOException; import java.util.ArrayLi ...

  4. Excel的数据导入到PB的DW中

    Excel的数据导入到PB的DW中//==================================================================== // Event:cb_ ...

  5. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012

    (注:注释的颜色原本为绿色,在这里变为黑色,有点不便,但不会造成阅读影响.放入Visual Basic2012代码编辑器后会还原成绿色.) 摘  要:DataGridView控件作为数据传输的中介,只 ...

  6. 向MySql数据库导入excel表数据

    最近要开发一个小的答题系统,如果题目人工录入那确实很麻烦.所以想到是不是可以从用一些现有数据格式的文件导入数据.在网上查了一下,看到有关于将excel的数据导入到mysql的方法.所以将题库数据整理成 ...

  7. 上传读取Excel文件数据

    /// <summary> /// 上传读取Excel文件数据 /// 来自http://www.cnblogs.com/cielwater /// </summary> // ...

  8. Excel大数据量分段导入到Oracle

    客户需要将一个具有2W多条数据的Excel表格中的数据导入到Oracle数据库的A表中,开始采用的是利用Oledb直接将数据读入到DataTable中,然后通过拼接InserInto语句来插入到数据库 ...

  9. C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表

    调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...

随机推荐

  1. DB2 中like的通配符以及escape关键字定义转义字符的使用

    DB2 LIKE谓词查询语句中支持 百分号(%).下划线(_)的使用,不支持方括号([])(注:它会把方括号当成实际的值而非通配符),当我们需要在LIKE 查询条件中将百分号(%).下划线(_)作为实 ...

  2. 【ubantu】Ubuntu的一些常用快捷键

    Ubuntu操作基本快捷键* 打开主菜单 = Alt + F1* 运行 = Alt + F2* 显示桌面 = Ctrl + Alt + d* 最小化当前窗口 = Alt + F9* 最大化当前窗口 = ...

  3. ASP.NET动态网站制作(20)-- C#(3)

    前言:C#的第三节课,继续上次课的内容,依旧围绕基础的只是讲解. 内容: 1.StringBuilder类:由于string类一旦创建,则不能更改.如果做字符串拼凑的话,将会非常耗费空间,如: str ...

  4. 三种光照模型的shader实现

    1.Lambert模型,公式为I=Kd*Il(N*L): Shader "Custom/Lambert_A" { Properties { _Diffuse(,,,) } SubS ...

  5. error items-9022:missing required icon file.the bundle does not contain an app icon for iPhone/iPad Touch of exactly '120x120' pixels,in.pen format for ios versions >= 7.0

    error items-9022:missing required icon file.the bundle does not contain an app icon for iPhone/iPad ...

  6. USB-HID鼠标、键盘通讯格式(转) 与本人实际测试结果

    内容为网络转载,如有版权问题请联系删除 USB鼠标键盘协议介绍. 鼠标发送给PC的数据每次4个字节:BYTE1 BYTE2 BYTE3 BYTE4.定义分别是:BYTE1 -- |--bit7:    ...

  7. how to add them, how to multiply them

    http://www.physics.miami.edu/~nearing/mathmethods/operators.pdf

  8. vue 指令系统的使用

    所谓指令系统,大家可以联想咱们的cmd命令行工具,只要我输入一条正确的指令,系统就开始干活了. 在vue中,指令系统,设置一些命令之后,来操作我们的数据属性,并展示到我们的DOM上. OK,接下来我们 ...

  9. 关于中国省市的一份js代码

    下面是一份关于中国省市的js代码,搜藏起来,非常有用. var arrCity = [ { name:"请选择", sub:[{name:"请选择"}], ty ...

  10. python __name__及__main()__的妙处

    #hello.py def sayHello(): str="hello" print(str); if __name__ == "__main__": pri ...