C#导出到Excel UTF-8问题

C#导出到Excel UTF-8问题,c#,excel,utf-8,C#,Excel,Utf 8,我试图将som数据导出到xls,但似乎UTF-8编码有问题。 它可以很好地导出,我可以查看Excel文件,但是当插入的数据具有特殊字符时,在本例中,丹麦字符为æ、徖和å,则该文件会有点过时。当我尝试在Excel中打开它时,我收到一条消息,说明在读取文件时出现了问题,并将该问题称为spreadseet的设置 我在几个通过验证的在线验证服务中运行了结果XML的验证。当我在记事本++XML验证程序中运行它时,我在først found special char(它是Å)中得到一个错误,它说:第XX行的

我试图将som数据导出到xls,但似乎UTF-8编码有问题。 它可以很好地导出,我可以查看Excel文件,但是当插入的数据具有特殊字符时,在本例中,丹麦字符为æå,则该文件会有点过时。当我尝试在Excel中打开它时,我收到一条消息,说明在读取文件时出现了问题,并将该问题称为spreadseet的设置

我在几个通过验证的在线验证服务中运行了结果XML的验证。当我在记事本++XML验证程序中运行它时,我在først found special char(它是Å)中得到一个错误,它说:第XX行的XML解析错误:输入不正确UTF-8,指示编码

有人能指出那是什么吗? 我应该在哪里指出编码

以下是生成的XML的相关部分:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Created>2006-09-25T13:34:53Z</Created>
  <LastSaved>2014-05-20T18:04:40Z</LastSaved>
  <Version>12.00</Version>
 </DocumentProperties>
 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  <RemovePersonalInformation/>
 </OfficeDocumentSettings>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>7875</WindowHeight>
  <WindowWidth>14895</WindowWidth>
  <WindowTopX>360</WindowTopX>
  <WindowTopY>300</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>

 ...

 </Styles>
  <Worksheet ss:Name="Ark1">
  <Names>
   <NamedRange ss:Name="GIS34_Skade_V1_alle_koder" ss:RefersTo="=Ark1!R5C2:R28C2"/>
  </Names>
  <Table ss:ExpandedColumnCount="16" ss:ExpandedRowCount="34" x:FullColumns="1" x:FullRows="1" ss:StyleID="s16" ss:DefaultRowHeight="15">
   <Column ss:StyleID="s16" ss:AutoFitWidth="0" ss:Width="30"/>
   <Column ss:StyleID="s16" ss:AutoFitWidth="0" ss:Width="135" ss:Span="2"/>
   <Column ss:Index="5" ss:StyleID="s19" ss:AutoFitWidth="0" ss:Width="30"/>
   <Column ss:StyleID="s16" ss:AutoFitWidth="0" ss:Width="135"/>
   <Column ss:StyleID="s19" ss:AutoFitWidth="0" ss:Width="30"/>
   <Column ss:StyleID="s16" ss:AutoFitWidth="0" ss:Width="135"/>
   <Column ss:StyleID="s19" ss:AutoFitWidth="0" ss:Span="3"/>
   <Row ss:AutoFitHeight="0" ss:Height="30" ss:StyleID="s18">
    <Cell ss:StyleID="s33"/>
    <Cell ss:StyleID="s126"><Data ss:Type="String">LE34</Data></Cell>
    <Cell ss:StyleID="s87"><Data ss:Type="String">Kunde:</Data></Cell>
    <Cell ss:StyleID="s32"><Data ss:Type="String">Assens Kommune</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0" ss:Height="30" ss:StyleID="s18">
    <Cell ss:StyleID="s33"/>
    <Cell ss:StyleID="s128"><Data ss:Type="String">GIS34</Data></Cell>
    <Cell ss:StyleID="s87"><Data ss:Type="String">Kodeliste:</Data></Cell>
    <Cell ss:StyleID="s32"><Data ss:Type="String">Arkil Århus V2</Data></Cell> <!-- Error occures in this line first because of the **Å** char -->
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="s33"/>
    <Cell ss:MergeAcross="6" ss:StyleID="s37"><Data ss:Type="String">Udformning af lagkontrol: </Data></Cell>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
   </Row>

   ...

   <Row ss:AutoFitHeight="0">
    <Cell ss:Index="2" ss:StyleID="s29"><NamedCell ss:Name="GIS34_Skade_V1_alle_koder"/></Cell>
    <Cell ss:StyleID="s30"><Data ss:Type="String">Billede 3 (filename)</Data></Cell>
    <Cell ss:StyleID="s30"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s20"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s20"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
    <Cell ss:StyleID="s16"/>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <PageSetup>
    <Header x:Margin="0.31496062992125984"/>
    <Footer x:Margin="0.31496062992125984"/>
    <PageMargins x:Bottom="0.74803149606299213" x:Left="0.70866141732283472" x:Right="0.70866141732283472" x:Top="0.74803149606299213"/>
   </PageSetup>
   <Print>
    <ValidPrinterInfo/>
    <PaperSizeIndex>9</PaperSizeIndex>
    <HorizontalResolution>600</HorizontalResolution>
    <VerticalResolution>600</VerticalResolution>
    <Gridlines/>
   </Print>
   <Selected/>
   <FreezePanes/>
   <FrozenNoSplit/>
   <SplitHorizontal>7</SplitHorizontal>
   <TopRowBottomPane>7</TopRowBottomPane>
   <ActivePane>2</ActivePane>
   <Panes>
    <Pane>
     <Number>3</Number>
    </Pane>
    <Pane>
     <Number>2</Number>
     <ActiveRow>26</ActiveRow>
     <ActiveCol>13</ActiveCol>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
  <QueryTable xmlns="urn:schemas-microsoft-com:office:excel">
   <Name>GIS34 Skade V1_alle koder</Name>
   <AutoFormatFont/>
   <AutoFormatPattern/>
   <QuerySource>
    <QueryType>Text</QueryType>
    <TextWizardSettings>
     <Name x:HRef="C:\Temp\dummy.txt"/>
     <Decimal>,</Decimal>
     <ThousandSeparator>.</ThousandSeparator>
     <TrailingMinusNumbers/>
     <FormatSettings>
      <FieldType>AutoFormat</FieldType>
     </FormatSettings>
     <Delimiters>
      <Tab/>
     </Delimiters>
    </TextWizardSettings>
    <VersionLastEdit>3</VersionLastEdit>
    <VersionLastRefresh>3</VersionLastRefresh>
   </QuerySource>
  </QueryTable>
 </Worksheet>
</Workbook>
更新1:

现在,我将导出代码更改为以下代码,其中我将字符串编码为UTF-8,得到了no良好的结果:

string excel = header.ToString() + styles.ToString() + title.ToString() + content.ToString() + footer.ToString();
context.Response.ContentType = "application/excel";
context.Response.AddHeader("Content-disposition", "attachment; filename=\"report.xls\"");
//context.Response.ContentEncoding = new System.Text.UTF8Encoding();
byte[] bytes = Encoding.Default.GetBytes(excel);
context.Response.Write(Encoding.UTF8.GetString(bytes));
更新2:

再次对此进行更改(由@Luaan建议),但仍然相同:

string excel = header.ToString() + styles.ToString() + title.ToString() + content.ToString() + footer.ToString();
context.Response.ContentType = "application/excel";
context.Response.AddHeader("Content-disposition", "attachment; filename=\"report.xls\"");
HttpContext.Current.Response.BinaryWrite(UTF8Encoding.UTF8.GetBytes(excel));

试着使用一些能正确使用的库,你会节省很多时间


    • 解决此问题的简单方法是在HttpContext.Current.Response中设置字符集,如下所示:

                  HttpContext.Current..Response.Charset = "UTF-8";
      
      代码的最完整部分:

                  curContext.Response.Clear();
                  curContext.Response.Buffer = true;
                  curContext.Response.Charset = "UTF-8";
                  curContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                  curContext.Response.AddHeader("content-disposition", "attachment;filename=" + FileName + ".xlsx");
      

      如果使用OpenXML,生成的xml必须有一行指定我在文件中没有看到的编码(类似于)。另外,如果您的xlsx无效,请将xlsx扩展名更改为zip,检查xml结构,反复使用它,直到找出错误。我认为这不是OpenXML,这不是Excel的传统xml格式吗?在任何情况下,
      excel
      是字符串还是字节数组?您是否先清除输出?编写字节数组可能会更安全—它可能会帮助您避免双重编码。@Luaan是的,它不是OpenXML,只是针对缺少的encoding=“UTF-8”属性提出了一点意见,我有过这方面的经验。@Luaan,
      excel
      是一个字符串。我尝试将此字符串编码为UTF-8(请参阅我的更新),但结果是相同的outcome@Ambran:添加属性是不够的,XML必须在适当的UTF-8.Luaan中,我改为(更新2),但它是相同的。我认为问题出在其他软件上。如果我发布整个C#代码和生成的整个XML,会更有帮助吗?@Ambran它很可能出现在XML生成代码中(很明显,您只是将字符串拼凑在一起,而不是使用XmlDocument或类似的东西)。尝试更深一点的调试-如果在将XML写入输出之前将正确的XML放入
      excel
      ,会发生什么?Luaan,数据集由用户选择。有些数据集的结果很好,有些则不然。我必须逐行检查XML,以确定哪里出了问题。
      <?xml version="1.0" encoding="utf-8"?>
      
      HttpContext.Current.Response.BinaryWrite(UTF8Encoding.UTF8.GetBytes(excel));
      
                  HttpContext.Current..Response.Charset = "UTF-8";
      
                  curContext.Response.Clear();
                  curContext.Response.Buffer = true;
                  curContext.Response.Charset = "UTF-8";
                  curContext.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                  curContext.Response.AddHeader("content-disposition", "attachment;filename=" + FileName + ".xlsx");