none
dataset数据写入excel的问题 RRS feed

  • 问题

  • 我的代码如下:

     public void DSToExcel(string Path, DataSet oldds)
            {
                //先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构
                //string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
                //string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
                string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
                //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 

                OleDbConnection myConn = new OleDbConnection(strCon);
                string strCom = "select * from [Sheet1$]";
                myConn.Open();
                OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
                System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
                //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
                builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)
                builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)
                DataSet newds = new DataSet();
                myCommand.Fill(newds, "table1");
                for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
                {
                    //在这里不能使用ImportRow方法将一行导入到news中,
                    //因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
                    //在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
                    DataRow nrow = newds.Tables["table1"].NewRow();
                    for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
                    {
                        nrow[j] = oldds.Tables[0].Rows[i][j];

                    }
                    newds.Tables["table1"].Rows.Add(nrow);
                }
                myCommand.Update(newds, "table1");
                myConn.Close();
            }

    在执行myCommand.Update(newds, "table1");

    报错

    System.Data.OleDb.OleDbException:“字段太小而不能接受所要添加的数据的数量。试着插入或粘贴较少的数据。”

    请问怎么解决?

    2021年5月11日 8:41

答案

  • 你好,

    根据我的测试,我发现你的错误是由于没有在新的datatable中添加想对应的列名导致。

    由于这边我添加的时候始终会多一行F1,所以用你的方法似乎我这边有点问题。

    然而,根据我的搜索,我找到了一种极为简单的方法,你可以看看。

    首先,你需要添加nuget包->ClosedXML.

    其次,你可以尝试下面的代码快速的将你的dataset转换为excel。

     private void button1_Click(object sender, EventArgs e)
            {
                DataSet set = new DataSet();
                DataTable table1 = new DataTable();
                table1.TableName = "table1";
                table1.Columns.Add("Name", typeof(string));
                table1.Columns.Add("Age", typeof(int));
                table1.Columns.Add("Id", typeof(int));
                table1.Rows.Add("test1",22,1001);
                table1.Rows.Add("test2", 23, 1002);
                table1.Rows.Add("test3", 24, 1003);
                set.Tables.Add(table1);
                string path = "D:\\test.xlsx";
                DSToExcel(path, set);
    
    
            }
    
            public void DSToExcel(string Path, DataSet oldds)
            {
                XLWorkbook wb = new XLWorkbook(Path);
                IXLWorksheet worksheet = wb.Worksheets.First();
                worksheet.Cell(1,1).InsertTable(oldds.Tables[0]);
                worksheet.Tables.First().Theme= XLTableTheme.None;
                wb.Save();
            }

    希望可以帮到你。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 BillQu0002 2021年5月18日 1:03
    2021年5月12日 9:06
    版主