C# 导入Excel数据到Datatable 在本地调试时没问题,上传到服务器就报错。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 导入Excel数据到Datatable 在本地调试时没问题,上传到服务器就报错。相关的知识,希望对你有一定的参考价值。

我的源代码:
System.Data.DataTable UMCIT = new System.Data.DataTable();
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\test.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";
System.Data.OleDb.OleDbConnection MyConnection = new System.Data.OleDb.OleDbConnection(conn);
System.Data.OleDb.OleDbDataAdapter MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [VariantsData$]", MyConnection);
MyConnection.Open();
MyCommand.Fill(UMCIT);
MyConnection.Close();
MyCommand = null;
MyConnection = null;
报错:
The Microsoft Jet database engine could not find the object 'C:\test.xls'. Make sure the object exists and that you spell its name and the path name correctly.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.OleDb.OleDbException: The Microsoft Jet database engine could not find the object 'C:\Creat.xls'. Make sure the object exists and that you spell its name and the path name correctly.

请各位高手帮帮忙!
改成下面这个样子也是不行的,同样报一样的错,文件就再我的C:里
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.xls;Extended Properties='Excel

Source=c:\test.xls;
上传到服务器,就会在服务器的c盘根目录找这个excel文件。
你要导入的excel文件需要先上传服务器的某个目录,
然后得到真实路径,然后才能操作。
不能使用绝对路径。因为你找的是你自己机子上的excel文件。
参考技术A string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\test.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";

前面加了 @ 后面就不需要 改成 C:\\test.xls 了。

希望对你有帮助

就是这样的,你把分给这位兄弟吧!他回答的是对的,你既然用了@,就不需要再用\\了,一个就够了,用了@,字符串就不会把字符串里面的东西当做转义字符来解析了!

不过,看你的错误,应该是没有找到文件!你查看下有没有你指定的文件!
参考技术B 是路径问题吧
服务器上有 'C:\Creat.xls' 文件吗

文件在你的c盘 在服务器上当然找不到了
确保服务器的c盘有该文件。
参考技术C string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\\test.xls;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'";

前面加了 @ 后面就不需要 改成 C:\\test.xls 了。

希望对你有帮助

Excel 导入到Datatable 中,再使用常规方法写入数据库

首先呢?要看你的电脑的office版本,我的是office 2013 .为了使用oledb程序,需要安装一个引擎。名字为AccessDatabaseEngine.exe。这里不过多介绍了哦。它的数据库连接字符串是"Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties=\'Excel 12.0; HDR=Yes; IMEX=1\'"

所以,我们是使用ole来读取excel的。

1 excel 的文件内容:

2 测试的页面设计图

3 webconfig里设置数据库相关字符串

4 测试页面的代码:

简单的布局,主要看功能:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExcelTodatabase.aspx.cs" Inherits="ExcelToDatabase.ExcelTodatabase" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:FileUpload ID="Excelfile" runat="server" />
    
        <asp:Button ID="btnFileUp" runat="server" Text="提交" OnClick="btnFileUp_Click" />
        <br />
        <br />
        <br />
        <asp:GridView ID="gvExcel" runat="server">
        </asp:GridView>
        <br />
        <br />
        <asp:Label ID="debug" runat="server" Text="Label"></asp:Label>
        <br />
    
    </div>
    </form>
</body>
</html>

5 主要功能:

5.1 导入文件

5.2 将excel导入datatable

5.3 将datatable 写入数据库

完整的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.IO;
using System.Configuration;

namespace ExcelToDatabase
{
    public partial class ExcelTodatabase : System.Web.UI.Page
    {
        // 连接字符串
        private static string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnFileUp_Click(object sender, EventArgs e)
        {
            if (Excelfile.HasFile)
            {
                //检查文件扩展名
                string filename = Path.GetFileName(Excelfile.PostedFile.FileName);
                //debug.Text = filename;
                string extension = Path.GetExtension(Excelfile.PostedFile.FileName);
                //debug.Text = extension;
                if (extension != ".xlsx")
                {
                    Response.Write("<script>alert(\'抱歉!您上传的不是有效的Excel文件\')</script>");
                }
                else
                {
                    //首先保存到服务器上
                    string newFileName = "excel"+DateTime.Now.ToString("yyyyMMddHHmmssfff");
                    string savePath = "ExcelFiles/"+newFileName;
                    Excelfile.PostedFile.SaveAs(Server.MapPath(savePath)+extension);
                    //debug.Text = Server.MapPath(savePath) + extension;
                    //这里可以导入数据了
                    string fileUrl = Server.MapPath(savePath) + extension;
                    DataTable dt = GetExcel(fileUrl);
                    gvExcel.DataSource = dt;
                    gvExcel.DataBind();
                    //写入数据库   
                    bool addToDb = InsertDb(dt);
                    if (addToDb)
                    {
                        Response.Write("<script>alert(\'写入数据库成功\')</script>");
                    }
                    else
                    {
                        Response.Write("<script>alert(\'抱歉!写入失败\')</script>");
                    }
                }
            }
            else
            {
                Response.Write("<script>alert(\'抱歉!您还没上传文件\')</script>");
            }
        }
        /// <summary>
        /// 根据文件名来导入excel到datatable
        /// </summary>
        /// <param name="fileUrl"></param>
        /// <returns></returns>
        public DataTable GetExcel(string fileUrl)
        {
            const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties=\'Excel 12.0; HDR=Yes; IMEX=1\'";
            DataTable dt = null;
            OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
            try
            {
                //打开连接
                if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }
                DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                //获取Excel的第一个Sheet名称
                string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim();
                //查询sheet中的数据
                string strSql = "SELECT * FROM [" + sheetName + "]";//sql语句,可以修改
                OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                dt = ds.Tables[0];
                return dt;
            }
            catch (Exception)
            {

                throw;
            }
        }
        public bool InsertDb(DataTable dt)
        {
            int result=0;
            //1 首先是要 定义好字段
            string name = "";
            string money = "";
            //遍历存在的表格
            foreach (DataRow dr in dt.Rows)
            {
                name = dr["name"].ToString().Trim();
                money = dr["money"].ToString().Trim();
                string sql = String.Format("insert into test(name,money)values(\'{0}\',\'{1}\')",name,money);//sql语句,测试用的
                using (SqlConnection conn=new SqlConnection(connString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(sql,conn);
                    result = cmd.ExecuteNonQuery();
                }
            }
            if (result>0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

实际运行的页面

数据库中内容:

简单的过程就是这样了。。

难度在于几个错误

1 未在本机计算机注册.............解决:看开头介绍的

2 其他的一些错误暂且未发现与程序相关的。可以自行解决。

完整项目下载地址:http://files.cnblogs.com/files/fanling521/ExcelToDatabase.rar

包含了excel文件

以上是关于C# 导入Excel数据到Datatable 在本地调试时没问题,上传到服务器就报错。的主要内容,如果未能解决你的问题,请参考以下文章

解决从Excel导入数据库,导入到DataTable时数据类型发生变化的问题(如数字类型变成科学计数法,百分数变成小数)

C# 将excel导入到DataGridView上 (可以对数据进行操作)

C#读取excel数据到datatable中

Excel 数据导入到DataTable

c# winform 怎么查询datatable里面的数据

如何高效地批量导入数据到SqlServer