在将数据从Excel文件转换为XML时,Dot被隐式转换为哈希

时间:2012-02-13 12:02:32

标签: c# xml excel oledb

我已成功使用以下C#代码从Excel文件创建XML文件:

protected void Button5_Click(object sender, EventArgs e)
{
    if (FileUpload1.HasFile)
    {
        OleDbConnection ole = new OleDbConnection();

        string s = Server.MapPath("../admin/ProductOptions");
        s = s + "\\" + FileUpload1.FileName;
        System.IO.File.Delete(s);
        FileUpload1.PostedFile.SaveAs(s);

        string path = s;
        ole.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\"";
        OleDbCommand command = new OleDbCommand("select * from[SHEET1$]", ole);
        DataSet ds = new DataSet();
        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(ds);

        GridView1.DataSource = ds.Tables[0];
        GridView1.DataBind();
        GridView1.Visible = true;

       string filepath = Server.MapPath("ProductOptions") + "\\" + DDLproduct.SelectedValue + ".xml";
        Session["ss"] = ds;

        write_to_xml(ds,filepath);
    }
    else
    {
        Label2.Visible = true;
        Label2.Text="[Please Select a file]";
    }
}

但问题是当此代码将Excel数据转换为XML数据时,本身会转换为Hash(仅第一行)。我知道原因,但不知道解决方案 由于Excel文件中的转换为XML标签时它会发生,它们会隐式转换为HASH .......
请建议我,我该如何阻止这种转换呢?

3 个答案:

答案 0 :(得分:4)

终于得到了解决方案:

  1. 当OLEDB适配器填充DataSet中的数据时,它会将DOT转换为HASH。

  2. 现在我已将该数据存储到DataTable(dt)中,然后访问列名并用DOT替换HASH(使用String的Replace方法)并使用新的列名创建一个新的DataTable(dt2)。 / p>

  3. 在使用两个for循环之后,我将数据从第一个DataTable(dt)插入到新的Datatable(dt2)。 (*一行为行,另一行为列)

  4. 最后使用新的DataTable(dt2)
  5. 绑定网格

    以下是该功能的完整代码:

    if (FileUpload1.HasFile)
    {
        OleDbConnection ole = new OleDbConnection();
    
        string s = Server.MapPath("../admin/ProductOptions");
        s = s + "\\" + FileUpload1.FileName;
    
        FileUpload1.PostedFile.SaveAs(s);
        string path = s;
    
        ole.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + path + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;IMEX=2;READONLY=FALSE;" + "\" ";
    
        OleDbCommand command = new OleDbCommand("select * from[SHEET1$]", ole);
    
        DataSet ds = new DataSet();
        OleDbDataAdapter adapter = new OleDbDataAdapter(command);
        adapter.Fill(ds);
    
        DataTable dt = (DataTable)ds.Tables[0];
        DataTable dt2 = new DataTable("dt2");
        Session["dt"] = null;
    
        for (int i = 0; i < dt.Columns.Count; i++)
        {
            string s2 = dt.Columns[i].ToString();
            s2 = s2.Replace("#", ".");
    
            string ProductName = s2.ToString();
            if (Session["dt"] == null)
           {
                DataColumn dCol1 = new DataColumn(ProductName, typeof(System.String));
               dt2.Columns.Add(dCol1);
            }
        }
    
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            dt2.Rows.Add();
            for (int x = 0; x < dt.Columns.Count; x++)
            {                
                dt2.Rows[i][x] = dt.Rows[i][x];        
            }        
        }
    
        System.IO.File.Delete(s);
    
        GridView1.DataSource = dt2;
        GridView1.DataBind();        
        GridView1.Visible = true;
    
        string filepath = Server.MapPath("ProductOptions") + "\\" + DDLproduct.SelectedValue + ".xml";
       // Session["ss"] = ds;
    
        write_to_xml(dt2,filepath);
    }
    else
    {
        Label2.Visible = true;
        Label2.Text="[Please Select a file]";
    }
    

    以下是write_to_xml()的代码:

    public void write_to_xml(DataTable dt, string path)
    {
        dt.WriteXml(path);
    }
    

    任何查询或替代解决方案都将受到赞赏......:)

答案 1 :(得分:0)

在连接字符串中按HDR=No关闭标题,然后完成工作。

在使用正则表达式或第一行中您想要的任何工具HDR=Yes替换. s #之前,将它们反馈给Excel。

答案 2 :(得分:0)

而不是您的解决方案,我以这种方式使用Encoding.UTF8

using (var fs = new FileStream(xmlFile, FileMode.CreateNew))
{
    using (var xw = new XmlTextWriter(fs, Encoding.UTF8))
    {
        ds.WriteXml(xw);
    }
}

没有问题,这也会将<转换为&lt;>转换为&gt;