zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    HDU 5585 Numbers
    HDU 3308 LCIS
    POJ 2991 Crane
    POJ 1436 Horizontally Visible Segments
    POJ 3667 Hotel
    HaiHongOJ 1003 God Wang
    【SDOI 2008】 递归数列
    5月19日省中提高组题解
    【HDU 1588】 Gauss Fibonacci
    【POJ 3233】Matrix Power Series
  • 原文地址:https://www.cnblogs.com/lucky_hu/p/2319047.html
Copyright © 2011-2022 走看看