.NET中导入导出Excel总结

时间:2022-09-17 07:39:40

前一段时间,做了Excle的导入和导出,在此记录开发思路及技术要点,以便在今后开发中参考。                                                                                                                                                                                                                                            ——我不是高手,只是善于总结;我也不是大神,只是善于发现你们经常忽略的东西。

一、导入Excle:开发中我们会遇到这样的需求把excle中的数据导入到数据库。不符合要求的数据过滤出来显示到页面给出错误信息提示,符合要求的数据导入到数据库。

开发思路:把要导入的excle数据转化成DataTable,然后操作转化后的DataTable。

a.读取excle转化为DataTabel:

 public DataTable ExcleToDataTable(string filePath,string name)
{ string xlsConnStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"", filePath);//连接字符串
string sql = string.Format("select * from [{0}$] where 1=1", name);//可是更改Sheet名称,比如sheet1,等等
OleDbConnection oleConn = new OleDbConnection(xlsConnStr);
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);
OleDbDataAdapter oleDataAdapter = new OleDbDataAdapter(sql, oleConn);
DataTable dt = null;
try
{
oleConn.Open();
DataSet ds = new DataSet();
oleDataAdapter.Fill(ds);
dt = ds.Tables[];
}
catch (Exception ex)
{
//数据绑定错误 自定义错误提示
}
finally
{
oleConn.Close();
}
return dt;
}

b.excle数据转化成DataTabel后,就可以操纵DataTable.这样开发就容易多了。

二、导出Excle:开发中我们会遇到这样的需求把页面上Grid或者其他存放数据控件中数据用Excle导出。

项目中自己做的例子:

private void ExportExcel()
{
//需要添加 Microsoft.Office.Interop.Excel引用
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); if (app == null)
{
//提示:服务器上缺少Excel组件,需要安装Office软件
ApplicationRun.GetInfoForm().Add(new UserControl.Message(MessageType.Error, "$CS_Lack_of_Excel_components_on_the_server_you_need_to_install_Office_software"));
return;
} app.Visible = false;
app.UserControl = true;
Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(System.Windows.Forms.Application.StartupPath + "\\template\\FTensionTSMachQuery.xlsx"); //加载模板
Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Sheets;
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(); //第一个工作薄。
if (worksheet == null)
{
//提示:工作薄中没有工作表
ApplicationRun.GetInfoForm().Add(new UserControl.Message(MessageType.Error, "$CS_There_is_no_worksheet_in_work_sheet"));
return;
}
string tCard = this.tCardEdit.Value.Trim();
FengHuoFacade _fhFacade = new FengHuoFacade(this.DataProvider);
//获取数据
object[] objZLSim = _fhFacade.QuerySimulationByTcard(tCard, "ZL"); int r = ;//定义行标(从第三行开始赋值)
#region 固定行填充数据
if (objZLSim != null)
{
SimulationForQuery zlSim = objZLSim[] as SimulationForQuery;
object objShift = _fhFacade.GetShift(tCard);
//模板固定行赋值
worksheet.Cells[r, ] = tCard;//抽丝编号
worksheet.Cells[r, ] = zlSim.CSLength;//抽丝长度
worksheet.Cells[r, ] = zlSim.CSEquipmentNo;//抽丝机台号
worksheet.Cells[r + , ] = FormatHelper.ToDateString(zlSim.Mdate);//生产时间
worksheet.Cells[r + , ] = zlSim.Muser;//操作人员
worksheet.Cells[r + , ] = zlSim.UVMark;//UV胶识
worksheet.Cells[r + , ] = FormatHelper.ToDateString(zlSim.Mdate);//张力生产日期
worksheet.Cells[r + , ] = objShift ==null ? "" : ((Shift)objShift).ShiftDescription;//班次
worksheet.Cells[r + , ] = zlSim.ZLEquipmentNo;//设备代码
worksheet.Cells[r + , ] = zlSim.Muser;//作业人员 }
#endregion int row_ = ;
#region 设计表头
worksheet.Cells[row_ - , ] = "ABS-2";
worksheet.Cells[row_ - , ] = "ABS-5";
worksheet.Cells[row_ - , ] = "盘状态";
Microsoft.Office.Interop.Excel.Range rgPState = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgPState.Merge(rgPState.MergeCells);//合并单元格 worksheet.Cells[row_ - , ] = "张力光纤编号";
Microsoft.Office.Interop.Excel.Range rgTcrd = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgTcrd.Merge(rgTcrd.MergeCells);//合并单元格 worksheet.Cells[row_ - , ] = "张力长度(米)";
Microsoft.Office.Interop.Excel.Range rgZLLength = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgZLLength.Merge(rgZLLength.MergeCells);//合并单元格 worksheet.Cells[row_ - , ] = "光纤外观";
Microsoft.Office.Interop.Excel.Range rgLooks = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgLooks.Merge(rgLooks.MergeCells);//合并单元格 worksheet.Cells[row_ - , ] = "光纤盘绕状态";
Microsoft.Office.Interop.Excel.Range rgCoilingState = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgCoilingState.Merge(rgCoilingState.MergeCells);//合并单元格 worksheet.Cells[row_ - , ] = "备注";
Microsoft.Office.Interop.Excel.Range rgMark = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row_ - , ]);
rgMark.Merge(rgMark.MergeCells);//合并单元格
#endregion #region 填充数据
double zlLengthTotal = ;
if (objZLSim != null && objZLSim.Length > )
{
for (int i = ; i < objZLSim.Length; i++)
{
worksheet.Cells[row_ + i, ] = "良/不良";
Microsoft.Office.Interop.Excel.Range rgGoodOrBad1 = worksheet.Cells.get_Range(worksheet.Cells[row_ + i, ], worksheet.Cells[row_ + i, ]);
rgGoodOrBad1.Merge(rgGoodOrBad1.MergeCells);//合并单元格
worksheet.Cells[row_ + i, ] = ((SimulationForQuery)objZLSim[i]).Rcard;//张力编号
worksheet.Cells[row_ + i, ] = ((SimulationForQuery)objZLSim[i]).ZLLength;//张力长度
zlLengthTotal += double.Parse(string.IsNullOrEmpty(((SimulationForQuery)objZLSim[i]).ZLLength) ? "" : ((SimulationForQuery)objZLSim[i]).ZLLength); worksheet.Cells[row_ + i, ] = "良/不良";
Microsoft.Office.Interop.Excel.Range rgGoodOrBad2 = worksheet.Cells.get_Range(worksheet.Cells[row_ + i, ], worksheet.Cells[row_ + i, ]);
rgGoodOrBad2.Merge(rgGoodOrBad2.MergeCells);//合并单元格 worksheet.Cells[row_ + i, ] = "良/不良";
Microsoft.Office.Interop.Excel.Range rgGoodOrBad3 = worksheet.Cells.get_Range(worksheet.Cells[row_ + i, ], worksheet.Cells[row_ + i, ]);
rgGoodOrBad3.Merge(rgGoodOrBad3.MergeCells);//合并单元格 worksheet.Cells[row_ + i, ] = "";//备注
Microsoft.Office.Interop.Excel.Range rgMarkValue = worksheet.Cells.get_Range(worksheet.Cells[row_ + i, ], worksheet.Cells[row_ + i, ]);
rgMarkValue.Merge(rgMarkValue.MergeCells);//合并单元格 }
}
#endregion int row = row_ + objZLSim.Length + ;//空四行
#region 合计
worksheet.Cells[row, ] = "张力良品总长度";
Microsoft.Office.Interop.Excel.Range rgZLLengthTotal = worksheet.Cells.get_Range(worksheet.Cells[row, ], worksheet.Cells[row + , ]);
rgZLLengthTotal.Merge(rgZLLengthTotal.MergeCells);//合并单元格 worksheet.Cells[row, ] = zlLengthTotal.ToString("");
Microsoft.Office.Interop.Excel.Range rgZLLengthTotalValue = worksheet.Cells.get_Range(worksheet.Cells[row, ], worksheet.Cells[row + , ]);
rgZLLengthTotalValue.Merge(rgZLLengthTotalValue.MergeCells);//合并单元格 worksheet.Cells[row, ] = "张力良率(%)";
Microsoft.Office.Interop.Excel.Range rgZLYield = worksheet.Cells.get_Range(worksheet.Cells[row, ], worksheet.Cells[row + , ]);
rgZLYield.Merge(rgZLYield.MergeCells);//合并单元格 try
{
worksheet.Cells[row, ] = (zlLengthTotal / double.Parse(((SimulationForQuery)objZLSim[]).CSLength)).ToString("0.000");
}
catch (Exception)
{ worksheet.Cells[row, ] = "";
}
Microsoft.Office.Interop.Excel.Range rgZLYieldValue = worksheet.Cells.get_Range(worksheet.Cells[row, ], worksheet.Cells[row + , ]);
rgZLYieldValue.Merge(rgZLYieldValue.MergeCells);//合并单元格 worksheet.Cells[row + , ] = "张力断线次数合计";
Microsoft.Office.Interop.Excel.Range rgZLBreakTimesTotal = worksheet.Cells.get_Range(worksheet.Cells[row + , ], worksheet.Cells[row + , ]);
rgZLBreakTimesTotal.Merge(rgZLBreakTimesTotal.MergeCells);//合并单元格 worksheet.Cells[row + , ] = ((SimulationForQuery)objZLSim[]).BreakTimes;
Microsoft.Office.Interop.Excel.Range rgZLBreakTimesTotalValue = worksheet.Cells.get_Range(worksheet.Cells[row + , ], worksheet.Cells[row + , ]);
rgZLBreakTimesTotalValue.Merge(rgZLBreakTimesTotalValue.MergeCells);//合并单元格 worksheet.Cells[row + , ] = "PT生存长";
Microsoft.Office.Interop.Excel.Range rgPT = worksheet.Cells.get_Range(worksheet.Cells[row + , ], worksheet.Cells[row + , ]);
rgPT.Merge(rgPT.MergeCells);//合并单元格 try
{
worksheet.Cells[row + , ] = (zlLengthTotal / double.Parse(((SimulationForQuery)objZLSim[]).PTTimes)).ToString("0.000");
}
catch (Exception)
{ worksheet.Cells[row + , ] = "";
} Microsoft.Office.Interop.Excel.Range rgPTValue = worksheet.Cells.get_Range(worksheet.Cells[row + , ], worksheet.Cells[row + , ]);
rgPTValue.Merge(rgPTValue.MergeCells);//合并单元格 #endregion //调整Excel的样式。
Microsoft.Office.Interop.Excel.Range rgStytle = worksheet.Cells.get_Range(worksheet.Cells[row_ - , ], worksheet.Cells[row + , ]);//定义范围
rgStytle.Borders.LineStyle = ;//添加边框
rgStytle.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//文本水平居中对齐
rgStytle.VerticalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//文本垂直居中对齐
worksheet.Columns.AutoFit(); //自动调整列宽。 #region 预览Excle
worksheet.DisplayAutomaticPageBreaks = true;//显示分页线
worksheet.PageSetup.CenterHorizontally = true;//水平居中
worksheet.PageSetup.CenterFooter = "第 &P 页,共 &N 页";
worksheet.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4;//A4纸张大小
worksheet.PageSetup.Orientation = Microsoft.Office.Interop.Excel.XlPageOrientation.xlPortrait;//纸张方向.纵向
app.Visible = true;
worksheet.PrintPreview(null);
app.Visible = false;
#endregion #region 保存到指定位置
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "导出Excel (*.xlsx)|*.xlsx|(*.xls)|*.xls";
saveFileDialog.FilterIndex = ;
saveFileDialog.Title = "导出Excel保存路径";
saveFileDialog.FileName = "FTensionTSMachQuery_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xlsx";
saveFileDialog.RestoreDirectory = true;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string savePath = saveFileDialog.FileName;
//Missing 在System.Reflection命名空间下。保存到指定位置
workbook.SaveAs(savePath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
workbook.Close(Missing.Value, Missing.Value, Missing.Value);
app.Quit();
KillExcel(app);
//提示:导出成功
ApplicationRun.GetInfoForm().Add(new UserControl.Message(MessageType.Success, "$CS_Export_Success"));
return;
}
app.DisplayAlerts = false;
workbook.Close(Missing.Value, Missing.Value, Missing.Value);
app.Quit();
KillExcel(app);
//直接打开excel表至打印预览
// PrintPriviewExcelFile(savePath);
#endregion
}
//调用底层函数获取进程标示 ,杀掉excle进程释放内存
[DllImport("User32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
private static void KillExcel(Microsoft.Office.Interop.Excel.Application theApp)
{
int id = ;
IntPtr intptr = new IntPtr(theApp.Hwnd);
System.Diagnostics.Process p = null;
try
{
GetWindowThreadProcessId(intptr, out id);
p = System.Diagnostics.Process.GetProcessById(id);
if (p != null)
{
p.Kill();
p.Dispose();
}
}
catch (Exception ex)
{ }
}

其中关键就实例化 Microsoft.Office.Interop.Excel.Application,以及操作Microsoft.Office.Interop.Excel.Application

对excle属性的使用可以参考:http://www.cnblogs.com/herbert/archive/2010/06/30/1768271.html

还有就是释放EXCLE.exe进程方法:如果不释放EXCLE.exe进程,那么每次导出exlec内存中会出现一个EXCLE.exe进程,多次导出后很占用内存。

    //调用底层函数获取进程标示 ,杀掉excle进程释放内存
[DllImport("User32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
private static void KillExcel(Microsoft.Office.Interop.Excel.Application theApp)
{
int id = ;
IntPtr intptr = new IntPtr(theApp.Hwnd);
System.Diagnostics.Process p = null;
try
{
GetWindowThreadProcessId(intptr, out id);
p = System.Diagnostics.Process.GetProcessById(id);
if (p != null)
{
p.Kill();
p.Dispose();
}
}
catch (Exception ex)
{ }
}

.NET中导入导出Excel总结的更多相关文章

  1. 从SQL Server中导入&sol;导出Excel的基本方法&lpar;转&rpar;

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  2. php中导入导出excel的原理

    在php中我们要经常导入导出excel文件,方便后台管理.那么php导入和导出excel的原理到底是什么呢?excel分为两大版本excel2007(后缀.xlsx).excel2003(后缀.xls ...

  3. jsp中导入导出excel,ssh框架

    导入Excel:jsp中 <form action="user_importTradingMoney" enctype="multipart/form-data&q ...

  4. Java中导入导出Excel -- POI技术

    一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实 ...

  5. &period;NET Core 中导入导出Excel

    操作Excel是一个比较常见的业务场景,本篇将使用EPPlus简单演示一个导入导出的示例. EPPlus开源地址:https://github.com/EPPlusSoftware/EPPlus 在项 ...

  6. ASP&period;NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  7. ASP&period;NET Core导入导出Excel文件

    ASP.NET Core导入导出Excel文件 希望在ASP.NET Core中导入导出Excel文件,在网上搜了一遍,基本都是使用EPPlus插件,EPPlus挺好用,但商用需要授权,各位码友若有好 ...

  8. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  9. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

随机推荐

  1. dubbo配置文件报错解决方案

    下载dubbo.xsd 文件 在eclipse->window->perferences->XML Catalog->Add ->File system->选择刚才 ...

  2. Bjarne Stroustrup对C&plus;&plus;程序员的忠告

    转自:http://blog.csdn.net/adm_qxx/archive/2007/05/20/1617488.aspx  第1章 致读者  [1] 在编写程序时,你是在为你针对某个问题的解决方 ...

  3. Codevs1378选课&lbrack;树形DP|两种做法&lpar;多叉转二叉|树形DP+分组背包&rpar;---&lpar;▼皿▼&num;&rpar;----&Hat;&lowbar;&lowbar;&lowbar;&Hat;&rsqb;

    题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...

  4. ElasticSearch使用IK中文分词---安装步骤记录

    提示1:必须保证之前的ES中不存在index, 否则ES集群无法启动, 会提示red! 提示2:下载的IK如果太新,会报错 TokenStream被重载Caused by: java.lang.Ver ...

  5. ACdream&Tab;1728 SJY&&num;39&semi;s First Task

    简单题. 先建树,我用邻接表来存了.然后对于每个叶子结点DFS一下,DFS深度超过了K就return,找到了叶子节点就记录下来,最后排个序,然后输出答案. 由于结点编号比较奇葩,所以用两个map来转换 ...

  6. &lpar;1&rpar;xcode基本设置和控制器等介绍

    1.在IOS应用程序中,如果没有对storyBoard进和设置它的界面是非常大,有时候如果把元素放在右边会出现运行程序时超出显示界面而不显示的问题.为了解决这个问题我们通常会在用模拟器设置调试界面的时 ...

  7. finereport报表--动态格间运算 一

    一.运算符:   ! 绝对值 A2[A2:!1] ;   A2 标示从列A纵向第2单元格开始,!1 表示第1个位置的单元格; [A2:!1] 代表索引,表示从A列纵向开始往下,第1个单元格的位置的索引 ...

  8. MySQL定时备份数据库(全库备份)

    一.MySQL数据备份 1.1. mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump ...

  9. MySQL之路 ——2、步履维艰的建表

    1.首先,在windows下,不区分大小写.Linux下可能要区分,具体参考下面文章 mysql表名忽略大小写问题记录 2.用command line client 每句以分号结尾. 3.Navica ...

  10. DevExpress如何实现皮肤的添加及本地化

    DevExpress.XtraBars.Helpers.SkinHelper类允许您填充现有RibbonGalleryBarItem或任意菜单(PopupMenu或BarSubItem)项目对应的De ...