Как не допустить удаления лидирующих нулей при экспорте в таблицу данных? - PullRequest
1 голос
/ 08 января 2009

Я столкнулся с той же проблемой, что и в этом вопросе:

Как предотвратить удаление начальных нулей при импорте документа Excel с помощью c #

Но я не уверен, что это лучшее решение для моего сценария. Вот код, который я использую для экспорта. Кто-нибудь знает, что я могу изменить, чтобы предотвратить смещение начальных 0?

private static void Export_with_XSLT_Web(DataSet dsExport, 
                                         string[] sHeaders, 
                                         string[] sFileds, 
                                         ExportFormat FormatType, 
                                         string FileName)
{

        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Buffer = true;

        HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        HttpContext.Current.Response.AppendHeader("content-disposition", 
                                                  "attachment; 
                                                  filename=" + FileName);
        }

        // XSLT to use for transforming this dataset.                       
        MemoryStream stream = new MemoryStream();
        XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

        CreateStylesheet(writer, sHeaders, sFileds, FormatType);
        writer.Flush();
        stream.Seek(0, SeekOrigin.Begin);

        XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
        XslTransform xslTran = new XslTransform();
        xslTran.Load(new XmlTextReader(stream), null, null);

        using(StringWriter sw = new StringWriter())
        {
            xslTran.Transform(xmlDoc, null, sw, null);

            HttpContext.Current.Response.Write(sw.ToString());                
            writer.Close();
            stream.Close();
            HttpContext.Current.Response.End();
        }
    }
}

Вот метод, который создает таблицу стилей, есть ли здесь что-нибудь, что я могу изменить, чтобы ввести некоторые или все поля в виде текста.

private static void CreateStylesheet(XmlTextWriter writer, 
                                     string[] sHeaders, 
                                     string[] sFileds, 
                                     ExportFormat FormatType)
{
    try
    {
        // xsl:stylesheet
        string ns = "http://www.w3.org/1999/XSL/Transform";
        writer.Formatting = Formatting.Indented;
        writer.WriteStartDocument();
        writer.WriteStartElement("xsl", "stylesheet", ns);
        writer.WriteAttributeString("version", "1.0");
        writer.WriteStartElement("xsl:output");
        writer.WriteAttributeString("method", "text");
        writer.WriteAttributeString("version", "4.0");
        writer.WriteEndElement();

        // xsl-template
        writer.WriteStartElement("xsl:template");
        writer.WriteAttributeString("match", "/");

        // xsl:value-of for headers
        for(int i = 0; i < sHeaders.Length; i++)
        {
            writer.WriteString("\"");
            writer.WriteStartElement("xsl:value-of");
            writer.WriteAttributeString("select", "'" + sHeaders[i] + "'");
            writer.WriteEndElement(); // xsl:value-of
            writer.WriteString("\"");
        }

        // xsl:for-each
        writer.WriteStartElement("xsl:for-each");
        writer.WriteAttributeString("select", "Export/Values");
        writer.WriteString("\r\n");

        // xsl:value-of for data fields
        for(int i = 0; i < sFileds.Length; i++)
        {
            writer.WriteString("\"");
            writer.WriteStartElement("xsl:value-of");
            writer.WriteAttributeString("select", sFileds[i]);
            writer.WriteEndElement(); // xsl:value-of
            writer.WriteString("\"");
        }

        writer.WriteEndElement(); // xsl:for-each
        writer.WriteEndElement(); // xsl-template
        writer.WriteEndElement(); // xsl:stylesheet
        writer.WriteEndDocument();
    }
    catch(Exception Ex)
    {
        throw Ex;
    }
}

Ответы [ 3 ]

2 голосов
/ 08 января 2009

Я не знаю, как получится преобразование XSL: я предполагаю, что это формат xml для Excel. Пытаясь повернуть вспять процесс, я написал три числа (007) в листе Excel: один раз как число, один раз как текст и один раз как число, но отформатированный, чтобы показать 3 цифры, дополненные нулями. Затем я сохранил его как XML и посмотрел на него. Вот фрагмент:

<Row>
    <Cell><Data ss:Type="Number">7</Data></Cell>
</Row>
<Row>
    <Cell><Data ss:Type="String" x:Ticked="1">007</Data></Cell>
</Row>
<Row>
    <Cell ss:StyleID="s22"><Data ss:Type="Number">7</Data></Cell>
</Row>

Я не копирую стиль, но вы можете легко это сделать.

Редактировать: как всегда Google - ваш друг (и мой тоже ;-)): http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndExcel.

Редактировать (2): Я думал, что ссылки было достаточно. В статье говорится, что (если вы уверены, что целью является только Excel), вы можете использовать специфичный для Excel синтаксис CSV. Так что в вашем случае и глядя на ваш код, я думаю, вам следует вставить пропущенные запятые и изменить открытие

writer.WriteString("\"");

в

writer.WriteString("=\"");

Остерегайтесь, что я не пробовал.

Только один вопрос из любопытства: не проще ли будет просто выводить то, что вам нужно, для работы с DataSet вместо

  • преобразование его в XML
  • генерация специального XSL
  • выполнение преобразования XSL
  • копирование результата в поток ответа

1 голос
/ 08 января 2009

добавьте '(одинарную кавычку) в начале строки.

0 голосов
/ 08 января 2009

Если вы знаете, что поле должно представлять собой 5-значный почтовый индекс (или некоторую часть SSN или что-то еще), вам, вероятно, придется исправить это вручную с помощью sprintf () или чего-то еще эквивалент C # есть. Если это поле не определено, вы полностью зависите от того, что читает данные.

Извините, я неправильно прочитал вопрос как чтение из Excel в HTML.

Рассматривали ли вы экспорт в формате CSV вместо Excel?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...