数据库和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.

aspose 获取excel的缩略图 Java版_UI

以下是后台代码。

aspose 获取excel的缩略图 Java版_Web_02

aspose 获取excel的缩略图 Java版_UI_03

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表的时候,总会出现乱序的情况,

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

aspose 获取excel的缩略图 Java版_UI_04

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

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

 

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

aspose 获取excel的缩略图 Java版_System_05

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

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

源码下载:PoseExcelToSql.rar