您的位置:首页 > 编程语言 > C#

C#使用Microsoft.Office.Interpo操作EXCEL遇到的问题总结

2016-07-26 14:25 796 查看
这两天用C#做了一个读取EXCEL文件的内容,然后保存到数据库的操作。

因为都是微软的东西,因此写起来比较简单,操作也比较方便。

下面贴上我使用的读取EXCEL的代码:

try
{
if (!txtFile.HasFile)
{
throw new Exception("请先择一个文件!");
}
String strFileExtensionName = System.IO.Path.GetExtension(this.txtFile.PostedFile.FileName);
if (strFileExtensionName != ".xlsx")
{
throw new Exception("请选择Excel文件!");
}
//保存文件
String strFilePath = @"C:\Temp\Import\" + Guid.NewGuid().ToString() + ".xlsx";
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(strFilePath)))
{
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(strFilePath));
}

using (System.IO.FileStream objFileStream = new System.IO.FileStream(strFilePath, System.IO.FileMode.Create))
{
//保存文件
Byte[] btData = new Byte[txtFile.PostedFile.InputStream.Length];
txtFile.PostedFile.InputStream.Read(btData, 0, btData.Length);
objFileStream.Write(btData, 0, btData.Length);
objFileStream.Close();

}

OpenExcel(strFilePath);
winFileUpload.Hide();
X.Redirect("xxxxxx.aspx");//刷新当前页面
Ext.Net.X.Msg.Alert("系统提示", String.Format("导入成功")).Show();
}
catch(Exception ex)
{
Ext.Net.X.Msg.Alert("系统提示", ex.Message).Show();
}

private void OpenExcel(string strFileName)
{
object missing = System.Reflection.Missing.Value;
Application excel = new Application();//lauch excel application
if(excel == null)
{
Response.Write("<script>alert('Can't access excel')</script>");
}
else
{
excel.Visible = false;
excel.UserControl = true;
// 以只读的形式打开EXCEL文件
Workbook wb = excel.Application.Workbooks.Open(strFileName, missing, true, missing, missing, missing,
missing, missing, missing, true, missing, missing, missing, missing, missing);
int count = wb.Worksheets.Count;
//this.Session
for (int j = 1;j <= count; j++)
{
//取得第一个工作薄
Worksheet ws = (Worksheet)wb.Worksheets.get_Item(j);
string sheetName = ws.Name;
Guid newGuid = Guid.NewGuid();//检查项目主键

Save_JCBZ(sheetName, newGuid);
//取得总记录行数   (包括标题列)
int rowsint = ws.UsedRange.Cells.Rows.Count; //得到行数
//int columnsint = mySheet.UsedRange.Cells.Columns.Count;//得到列数

//取得数据范围区域 (不包括标题列)
Range rng1 = ws.Cells.get_Range("B3", "B" + rowsint);   //item

Range rng2 = ws.Cells.get_Range("C3", "C" + rowsint); //Customer
object[,] arryItem = (object[,])rng1.Value2;   //get range's value
object[,] arryCus = (object[,])rng2.Value2;
//将新值赋给一个数组
//string[,] arry = new string[rowsint-1, 2];
for (int i = 1; i < arryItem.Length; i++)
{
Save_JCBZ_Content(arryItem[i, 1].ToString(), arryCus[i, 1].ToString(), newGuid);
}
}
}
excel.Quit();
excel = null;

Process[] procs = Process.GetProcessesByName("excel");
foreach(Process pro in procs)
{
pro.Kill();//没有更好的方法,只有杀掉进程
}
GC.Collect();
}


以上就是读取EXCEL内容进行操作了,相信很好理解。

在我本机操作的也很顺利。但是问题来了,当我将代码发布到服务器上,我再访问服务器上的程序进行操作的时候,一开始是拒绝访问的。

出现了这个错误:

检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。


经过查询,查到了前辈们写的博客里的解决方案。然后照着前辈们的解决方法去操作,当然也有效果。

一开始是在 web.config 中的 System.web 节点里面添加服务器访问授权:

<System.web>
<identity impersonate="true" userName="administrator" password="administrator"/>
</System.web>


但是这么写有一个非常严重的问题,那就是把服务器的管理员信息直接暴漏出来了,对于服务器来说这非常的不安全。(还有一个问题就是如果服务器的管理员密码被修改了这里应该就不起作用了。)但是还是这么用了,因为暂时没有更好的办法。

那么这个问题就解决了,这个错误也不出现了。

这样就能够启动Application进程,操作EXCEL了,能够新建EXCEL导出EXCEL,然而事情怎么会这么简单就结束呢,新的问题来了,那就是还是不能打开服务器端的EXCEL文件。

不让我对excel进行读取,写入已经完成,那么我现在需要读取了,就告诉我:

Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。”


这怎么能行呢!继续向前辈们请教。说要对DCOM组件进行授权:

在服务器上安装office的Excel软件.

在”开始”->”运行”中输入dcomcnfg.exe启动”组件服务”,

依次双击”组件服务”->”计算机”->”我的电脑”->”DCOM配置”

在”DCOM配置”中找到”Microsoft Excel 应用程序”,在它上面点击右键,然后点击”属性”,弹出”Microsoft Excel 应用程序属性”对话框(肯定在这个地方还会遇到一个问题,那就是找不到EXCEL应用程序,这是因为服务器是64的,但是EXCEL安装的是32位导致的,重新第二步,输入“comexp.msc -32”,打开32位组件。)

点击”标识”标签,选择”交互式用户”

点击”安全”标签

6-1. “启动和激活权限”上点击”自定义”,然后点击对应的”编辑”按钮,在弹出的”安全性”对话框中加添加个三个:Everyone,Interactive,”NETWORK SERVICE”用户(注意要选择本计算机名),并给它赋予”本地启动”和”本地激活”权限.

6-2. “访问权限”上点击”自定义”,然后点击”编辑”,在弹出的”安全性”对话框中也填加三个Everyone,Interactive,”NETWORK SERVICE”用户,然后赋予”本地访问”权限.

6-3. “配置权限”上点击”自定义”,然后点击”编辑”,在弹出的”安全性”对话框中也填加三个Everyone,Interactive,”NETWORK SERVICE”用户,然后赋予”本地访问”权限.

点击”标识”标签:选择交互式用户。

以上总结了所有的操作,到此应该是可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel 微软 数据库