从ASP.NET应用程序上传Excel文件到MySQL时出错

15

我正在使用ASP.NET开发一个网络应用程序,并使用MySQL数据库。当我通过此应用程序上传Excel文件(.xlsx)时,没有任何问题。但当文件超过24904条记录时问题就出现了。

此时会出现以下错误:

此表格包含超出此电子表格定义的单元格范围的单元格。

并且仅写入前24904条记录。

我尝试将负载分成多个批次进行加载,但不起作用。

有什么想法吗?

Dim connExcel As New System.Data.OleDb.OleDbConnection(conStr)
Dim cmdExcel As New System.Data.OleDb.OleDbCommand()
Dim dt As New DataTable()
Dim dataset As New DataSet
Dim x As Integer = 2
Dim y As Integer = 20001
Dim range As String = "A" + x.ToString + ":" + "I" + y.ToString

cmdExcel.Connection = connExcel

If erro = 0 Then
    Try

        For i As Integer = 0 To 50
            connExcel.Open()

            dataset.Reset()
            dataset.Clear()

            Dim oda As New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$" & range.ToString & "]", connExcel)
            oda.TableMappings.Add("Table", "ExcelTest")

            oda.Fill(dataset)
            connExcel.Close()

            If dataset.Tables(0).Rows.Count > 0 Then
                SendToDB(dataset)
            Else
                i = 50
            End If

            x = x + 20000
            y = y + 20000

            range = "A" + x.ToString + ":" + "I" + y.ToString
        Next

        Label7.Visible = True
        Label7.Text = "The information has been written successfully from 0 to " + y.ToString

    Catch ex As Exception
        Label9.Visible = True
        Label9.Text = "Database Error 2:" + ex.Message
        connExcel.Close()
    End Try
End If

1
哪一行抛出了错误? - Tim Williams
4
你已经核实了第24905行的数据是否在定义的标题列外没有多余的数据吗? - dhirschl
Tim Williams - 我在记录24904后读取Excel时出现错误,这似乎是某种限制。 - Orlando Lares
你尝试过将额外的行放在新工作表中吗?(Page1,Page 2)类似这样的操作? - Rohith Nair
你已经指定了 Excel 范围为 20001,这可能是原因,因为它不接受更多的记录。尝试使用类似这样的范围:range = xlWorkSheet.UsedRange; - MahaSwetha
显示剩余3条评论
6个回答

1
我不使用OLDB或Excel,因为读取Excel时会出现许多问题。
我使用ExcelDataReader https://github.com/ExcelDataReader/ExcelDataReader 尝试这个:
Install-Package ExcelDataReader
public static DataSet GetExcelDataSet(string filePath)
    {
        FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

        IExcelDataReader excelReader;
        if (Path.GetExtension(filePath) == ".xls")
        {
            //Choose one of either 1 or 2
            //1. Reading from a binary Excel file ('97-2003 format; *.xls)
            excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        }
        else
        {
            //2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
            excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        }
        //Choose one of either 3, 4, or 5
        //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();
        return result;
    }

0

我猜想您可能已经触及到了Excel的极限(例如您可以添加的表格映射数量)

尝试从更高的数字开始您的循环计数,并查看是否是执行此操作的次数而不是数据本身导致了问题。也许可以尝试如下方式:

Dim x As Integer = 40002
Dim y As Integer = 60001

0

移除范围使用Sheet1 ...并重新测试 Dim oda As New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", connExcel)


0

您可以通过添加计数器变量来重置您的范围......为特定范围增加它......然后将其重置...


0

Excel的限制比这个要大。您的单元格包含超出指定范围(如错误消息所述)的隐藏字符或空格,请检查错误行右侧的列。我认为您会发现它们包含某些内容。

一个简单的测试方法是创建一个全新的文件,包含50,000条记录,并填充新数据。我相信您会发现它可以正常工作。


0

您也可以在文件查询中使用LOAD DATA将Excel文件加载到数据库中。查询的语法如下:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [CHARACTER SET charset_name]
    [{FIELDS | COLUMNS}
        [TERMINATED BY 'string']
        [[OPTIONALLY] ENCLOSED BY 'char']
        [ESCAPED BY 'char']
    ]
    [LINES
        [STARTING BY 'string']
        [TERMINATED BY 'string']
    ]
    [IGNORE number LINES]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接