如何导入HTML格式的Excel

时间:2015-06-03 07:36:00

标签: c# asp.net excel import

我使用HttpContext从数据库导出数据,格式为table,tr和td。我想读取相同的文件并转换为数据表。

<add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='HTML Import;HDR={1};IMEX=1'" />

<add name="Excel03ConString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1};IMEX=1'" />

    private DataTable GetTableFromExcel()
    {
        DataTable dt = new DataTable();

        try
        {
            if (exclFileUpload.HasFile)
            {
                string FileName = Path.GetFileName(exclFileUpload.PostedFile.FileName);
                string Extension = Path.GetExtension(exclFileUpload.PostedFile.FileName);
                string FolderPath = Server.MapPath(ConfigurationManager.AppSettings["FolderPath"]);
                //string NewFileName = string.Format("{0}_{1}", DateTime.Now.ToString().Replace("/", "").Replace(" ", "").Replace(":", ""), FileName);
                string FilePath = Path.Combine(string.Format("{0}/{1}", FolderPath, FileName));
                exclFileUpload.SaveAs(FilePath);
                string conStr = "";
                switch (Extension)
                {
                    case ".xls": //Excel 97-03
                        conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
                        break;
                    case ".xlsx": //Excel 07
                        conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
                        break;
                }
                conStr = String.Format(conStr, FilePath, true);
                OleDbConnection connExcel = new OleDbConnection(conStr);
                OleDbCommand cmdExcel = new OleDbCommand();
                OleDbDataAdapter oda = new OleDbDataAdapter();

                cmdExcel.Connection = connExcel;

                connExcel.Open();
                DataTable dtExcelSchema;
                dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                connExcel.Close();

                connExcel.Open();
                cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
                oda.SelectCommand = cmdExcel;
                oda.Fill(dt);
                connExcel.Close();
                File.Delete(FilePath);

            }
        }
        catch (Exception ex)
        {

        }
        return dt;
    }

当使用第二个连接字符串时,我收到错误“外部表格在connection.Open()上没有预期的格式。”但是当使用第一个时,我在阅读工作表名称时遇到错误。

请告诉我如何阅读表格,或直接从Excel中读取数据。

4 个答案:

答案 0 :(得分:3)

我认为这个Third party dll-(ExcellDataReader)可能有助于解决您的问题。

FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

//1. Reading from a binary Excel file ('97-2003 format; *.xls)
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
//...
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
//3. DataSet - The result of each spreadsheet will be created in the result.Tables
DataSet result = excelReader.AsDataSet();
//...
//4. DataSet - Create column names from first row
excelReader.IsFirstRowAsColumnNames = true;
DataSet result = excelReader.AsDataSet();

//5. Data Reader methods
while (excelReader.Read())
{
    //excelReader.GetInt32(0);
}

//6. Free resources (IExcelDataReader is IDisposable)
excelReader.Close();

答案 1 :(得分:0)

我在网上找到了这个: C# Excel file OLEDB read HTML IMPORT

他们在这里说:

  

您必须使用页面标题,而不是使用工作表名称   没有$的select语句。 SELECT * FROM [HTMLPageTitle]

在该帖子中,他们还链接到本手册,这可能会派上用场,但在此处复制时间过长: http://ewbi.blogs.com/develops/2006/12/reading_html_ta.html

如果这不起作用,我认为你必须重新创建原始的excel,所以它仍然是一个excel文件,而不是HTML(如果在你的场景中完全可能)

答案 2 :(得分:0)

由于不同的原因,您可能会遇到此问题。对于这一个,有不同的解决方案是使您的解决方案调试为x86。以下是将其更改为x86的方法。

  • 右键单击Visual Studio中的sloution。
  • 单击配置管理器
  • x86选择Active solution platform(如果有)
  • 如果无法使用,请点击New并选择或输入x86,然后点击确定。
  • 重建解决方案并运行您的应用程序。

如果此解决方案无法解决您的问题,则可能需要安装32 bit版本的office system drivers。这是一个完整的article解释问题。

答案 3 :(得分:0)

经过深入研究后,我找到了解决方案。

首先使用以下代码将特定Excel文件转换为html页面。

File.Move(Server.MapPath("~/Foldername/ExcelName.xls",Path.ChangeExtension(Server.MapPath("~/Foldername/ExcelName.xls"), ".html"));

我们必须下载HTML字符串并提取内容。标签包含和标签,但它可能具有样式属性。首先,我们必须避免这些样式属性,然后才能从表中获取所需的内容。

string url = Server.MapPath("~/FolderName/Excelname.html");
WebClient wc = new WebClient();
string fileContent = wc.DownloadString(url);

这里我们必须格式化HTML标签以避免样式属性。

const string msgFormat = "table[{0}], tr[{1}], td[{2}], a: {3}, b: {4}";   
const string table_pattern = "<table.*?>(.*?)</table>"; 
const string tr_pattern = "<tr.*?>(.*?)</tr>"; 
const string td_pattern = "<td.*?>(.*?)</td>"; 
const string a_pattern = "<a href=\"(.*?)\"></a>"; 
const string b_pattern = "<b>(.*?)</b>";

完成循环后,我们可以找到<tr><td>元素。然后,我们可以使用此方法在<td></td>标记内获取内容。

private static List<string> GetContents(string input, string pattern)
{ 
    MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Singleline); 
    List<string> contents = new List<string>(); 
    foreach (Match match in matches) 
    contents.Add(match.Value); 
    return contents; 
}

然后我们可以按行将导入的记录插入数据库。

Reference link here