【问题标题】:how can i convert all rows into txt file?如何将所有行转换为 txt 文件?
【发布时间】:2017-04-17 02:33:36
【问题描述】:

我已经有了将 .xls 转换为 .txt 的代码。但问题是,它只导出一行并停止。我需要添加什么代码才能读取所有行并将其转换为 txt 文件?

下面是我的代码:

using (OleDbConnection cn = new OleDbConnection())
        {
            using (OleDbCommand cmd = new OleDbCommand())
            {
                cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"C:\Users\jediablaza\Documents\EDIExcel\EDIExcel.xls" + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";
                cmd.Connection = cn;
                cmd.CommandText = "SELECT * from [Sheet1$]";
                using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    adp.Fill(dt);
                    using (StreamWriter wr = new StreamWriter(@"C:\Users\jediablaza\Documents\EDIExcel\EDIExcel.txt"))
                    {
                        foreach (DataRow row in dt.Rows)
                        {

                                wr.WriteLine(row[0] + "\t" + row[1] + "\t" + row[2] + "\t" + row[3] + "\t" + row[4]);

                        }
                    }
                }
            }
        }

文本的输出如下所示

SHARPDTL    TESTDTL1    TESTDTL2    TESTDTL3    TESTDTL4

但是excel文件内容是

SHARPHDR1   TESTDHR1    TESTHDR2    TESTHDR3    TESTHDR4
SHARPDTL    TESTDTL1    TESTDTL2    TESTDTL3    TESTDTL4

【问题讨论】:

  • 为什么要为row 使用固定索引?
  • 嗨@AlbertoEstrella,我怎么能在循环内?我是新手

标签: c# excel oledb oledbconnection


【解决方案1】:

我认为问题在于您的连接属性:HDR=Yes

所以第一行将是文件的标题。 改成HDR=No

“HDR=是的;”表示第一行包含列名,而不是 数据。 “HDR=否;”表示相反。

参考链接:excel connection

【讨论】:

  • @JediAblaza 这看起来就是答案,请查看此链接以获取更多信息:connectionstrings.com/microsoft-jet-ole-db-4-0。也许尝试在源文件中使用更多行,您会注意到第一行被跳过。
  • "HDR=是;"表示第一行包含列名,而不是数据。 “HDR=否;”表示相反。
【解决方案2】:

显然您的问题是您在 foreach 循环中使用了固定索引。

我试图在下一个块中修复你的代码,我不能保证它会运行,因为它是在我的手机上制作的,仅供参考。

using (OleDbConnection cn = new OleDbConnection())
    {
        using (OleDbCommand cmd = new OleDbCommand())
        {
            cn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"C:\Users\jediablaza\Documents\EDIExcel\EDIExcel.xls" + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";
            cmd.Connection = cn;
            cmd.CommandText = "SELECT * from [Sheet1$]";
            using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd))
            {
                DataTable dt = new DataTable();
                adp.Fill(dt);
                using (StreamWriter wr = new StreamWriter(@"C:\Users\jediablaza\Documents\EDIExcel\EDIExcel.txt"))
                {
                    foreach (DataRow row in dt.Rows)
                    {
                            var strBldr = new StringBuilder();

                            foreach (var col in row.Columns)
                            {
                                strBldr.Append("{col}\t");
                            }

                            wr.WriteLine(strBldr);
                    }
                }
            }
        }
    }

【讨论】:

  • 我对某些事情感到困惑,我意识到您只有 5 列,这就是为什么您将其引用为固定索引,我的答案中的改进只是为了具有动态列大小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2021-12-24
  • 2017-02-09
  • 2017-09-23
相关资源
最近更新 更多