Точка неявно преобразуется в хеш при преобразовании данных из файла Excel в XML - PullRequest
5 голосов
/ 13 февраля 2012

Мне удалось создать файл XML из файла Excel, используя следующий код C #:

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, тогда точки сами преобразуются в хэш (только первая строка). Я знаю причину, но не знаю решения.
Это происходит из-за точек в файле Excel при преобразовании в теги XML, которые они неявно преобразуются в HASH .......
Пожалуйста, предложите мне, как я могу остановить это преобразование?

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Наконец-то получили решение:

  1. Когда OLEDB Adapter заполняет данные в DataSet, он преобразует DOT в HASH.

  2. Теперь у меня естьсохранил эти данные в DataTable (dt), а затем получил доступ к имени столбца и заменил HASH на DOT (используя метод замены String) и создал новый DataTable (dt2) с новыми именами столбцов.

  3. После этого, используя два цикла for, я вставил данные из первой таблицы данных (dt) в новую таблицу данных (dt2).(* один цикл для строк, а другой для столбцов)

  4. Наконец, свяжите сетку с новой таблицей данных (dt2)

Ниже приведен полный код этой функции:

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);
}

Любой запрос или альтернативное решение будет оценено ...:)

0 голосов
/ 04 января 2017

Вместо вашего решения я использую Encoding.UTF8 таким образом:

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

И не было никаких проблем, это также преобразует < в &lt; и > в &gt;.

0 голосов
/ 30 января 2015

Отключите ваши заголовки на HDR=No в строке подключения и получите работу.

Перед тем, как передать их обратно в Excel с HDR=Yes, замените . s на # s, используя регулярное выражение или любой инструмент, который вы хотите в первом ряду.

...