Aspose实现读取/ 写入Excel初探及相关问题的提出

数据库和Excel数据交互在生产生活中是很普遍的,实现方式也各异。最近在项目中使用了.NET Excel组件,在本机上运行并没有出现什么情况。而且该组件使用起来也比较简单,功能也很强大。但是将站点发布到服务器上,总是报错。在网上查阅相关资料后,按照步骤哦对服务器进行了配置,结果仍然存在问题。以下是报错信息:

 

“/”应用程序中的服务器错误。


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

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.UnauthorizedAccessException: 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。

由于赶时间,只好想办法改写程序。

之前听说过Aspose组件的强大,他是一款第三方组件,好像也想收费。还好,师兄那里有现成的。以前只是用过该组件从数据库读取数据填充到Excel的功能。其他功能均未使用过。于是就想尝试一下,从Excel读取数据写入到数据库。查了些资料,没找到比较完整的。于是自己做了一个马马虎虎还是能够实现这个功能,但是还在存在一些问题。自己写出来,也希望和大家交流一下,同时也希望大家给点参考。

 首先,还是要设计一个Excel模板的,我的模板名为test.xls.

以下是后台代码。

View Code
  1 using System;
2 using System.Collections;
3 using System.Configuration;
4 using System.Data;
5 using System.Linq;
6 using System.Web;
7 using System.Web.Security;
8 using System.Web.UI;
9 using System.Web.UI.HtmlControls;
10 using System.Web.UI.WebControls;
11 using System.Web.UI.WebControls.WebParts;
12 using System.Xml.Linq;
13 using Aspose.Cells;
14 using System.Data.SqlClient;
15
16
17 namespace PoseExcelToSql
18 {
19 /// <summary>
20 /// 应用第三方组件实现ExcelToSql
21 /// Author:LuckyHu
22 /// DateTime:2012-01-01 20:38
23 /// </summary>
24 public partial class _Default : System.Web.UI.Page
25 {
26 string connStr = "Data Source=.;Initial Catalog=StuInFo;Integrated Security=True";
27 SqlConnection conn = null;
28 protected void Page_Load(object sender, EventArgs e)
29 {
30 Cells cells;
31 Workbook workbook = new Workbook();
32 workbook.Open("C:\\test.xls");
33 cells = workbook.Worksheets[0].Cells;//暂时只针对第一张表
34 int result = 0;
35 int res = 0;
36 for (int i = 0; i < cells.MaxDataRow + 1; i++)
37 {
38 for (int j = 0; j < cells.MaxDataColumn + 1; j++)
39 {
40 //string s = cells[i, j].StringValue.Trim();
41 //string s = cells[]
42 //一行行的读取数据,插入数据库的代码也可以在这里写
43
44 string sno = cells[i, j].StringValue.Trim();//学号
45 string name = cells[i, j + 1].StringValue.Trim();//姓名
46 string sex = cells[i, j + 2].StringValue.Trim();//性别
47 string dept = cells[i, j + 3].StringValue.Trim();//系别
48 string age = cells[i, j + 4].StringValue.Trim();//年龄
49 if (name != "姓名" && age != "年龄" && sex != "性别" && dept != "系别" && sno != "学号" && name != "" && age != "" && sex != "" && dept != "" && sno != "")//消除表头
50 {
51 //DataSet ds = new DataSet();
52 //插入数据库操作在这里写
53 //Response.Write("Hello!");
54 try
55 {
56 conn = new SqlConnection(connStr);
57 if (conn.State == ConnectionState.Closed)
58 {
59 conn.Open();
60 }
61 // 插入之前判断数据库中是否存在本条记录
62 string ExistSql = "select COUNT(1) from student where SNO = '" + sno + "'";
63 bool bs = Exist(ExistSql, conn);
64 if (bs == false)//不存在才插入
65 {
66 string insertSql = "insert into student values('" + sno + "','" + name + "','" + sex + "','" + dept + "','" + age + "')";
67 SqlCommand cmd = new SqlCommand(insertSql, conn);
68 result = cmd.ExecuteNonQuery();
69 if (result > 0)
70 {
71 res += result;
72 }
73 }
74 }
75 catch (SqlException ex)
76 {
77 Response.Write("<script>alert('" + ex.ToString() + "')</script>");
78 }
79 finally
80 {
81 if (conn.State == ConnectionState.Open)
82 {
83 conn.Close();
84 }
85 }
86 }
87 }
88 }
89 Response.Write("<script>alert('" + res.ToString() + "')</script>");//输出录入结果
90 }
91
92 public bool Exist(string ExistSql, SqlConnection conn)
93 {
94 bool bs = false;
95 if (conn.State == ConnectionState.Closed)
96 {
97 conn.Open();
98 }
99 try
100 {
101 SqlCommand cmd = new SqlCommand(ExistSql, conn);
102 int res = int.Parse(cmd.ExecuteScalar().ToString());
103 if (res != 0)
104 {
105 bs = true;
106 }
107 }
108 catch (SqlException ex)
109 {
110 Response.Write("<script>alert('" + ex.ToString() + "')</script>");//输出录入结果
111 }
112 return bs;
113 }
114 }
115 }

 

自己同时借此机会,提出自己的疑惑,

使用以下代码

                    string sno = cells[i, j].StringValue.Trim();//学号
string name = cells[i, j + 1].StringValue.Trim();//姓名
string sex = cells[i, j + 2].StringValue.Trim();//性别
string dept = cells[i, j + 3].StringValue.Trim();//系别
string age = cells[i, j + 4].StringValue.Trim();//年龄

此种方式时遍历Excel表的时候,总会出现乱序的情况,

如下,也就是说,字段名和实际值并没有对应。这个是插入到数据库表的情况

暂时想了个办法,加了个条件

                    if (name != "姓名" && age != "年龄" && sex != "性别" && dept != "系别" && sno != "学号" && name != "" && age != "" && sex != "" && dept != "" && sno != "")//消除表头

 

加了过滤条件后,插入正常,

显然,我不是很满意,这样就会要求Excel中这几个字段每一个都不能空。这显然会存在问题。

请高手们指点一下!先谢过大家了!

源码下载:PoseExcelToSql.rar 

posted @ 2012-01-11 11:45  楠木大叔  阅读(1028)  评论(0编辑  收藏  举报