【问题标题】:error while exporting to excel data : ' ', hexadecimal value 0x07, is an invalid character using c#导出到 excel 数据时出错:'',十六进制值 0x07,是使用 c# 的无效字符
【发布时间】:2014-06-16 16:45:29
【问题描述】:

当我尝试将 kendo ui 网格中的数据导出到 excel 时遇到奇怪的问题.....

错误:

  An exception of type 'System.ArgumentException' occurred in System.Xml.dll but was not handled in user code

Additional information: ' ', hexadecimal value 0x07, is an invalid character.

以及我用于导出到excel的以下方法

  private static void WriteDataTableToExcelWorksheet(DataTable dt, WorksheetPart worksheetPart)
  {
        OpenXmlWriter writer = OpenXmlWriter.Create(worksheetPart);
        writer.WriteStartElement(new Worksheet());
        writer.WriteStartElement(new SheetData());

        string cellValue = "";

        int numberOfColumns = dt.Columns.Count;
        bool[] IsNumericColumn = new bool[numberOfColumns];

        string[] excelColumnNames = new string[numberOfColumns];
        for (int n = 0; n < numberOfColumns; n++)
            excelColumnNames[n] = GetExcelColumnName(n);

        uint rowIndex = 1;

        writer.WriteStartElement(new Row { RowIndex = rowIndex });
        for (int colInx = 0; colInx < numberOfColumns; colInx++)
        {
            DataColumn col = dt.Columns[colInx];
            AppendTextCell(excelColumnNames[colInx] + "1", col.ColumnName, ref writer);
            IsNumericColumn[colInx] = (col.DataType.FullName == "System.Decimal") || (col.DataType.FullName == "System.Int32") || (col.DataType.FullName == "System.Double") || (col.DataType.FullName == "System.Single");
        }
        writer.WriteEndElement();   

        double cellNumericValue = 0;
        foreach (DataRow dr in dt.Rows)
        {

            ++rowIndex;

            writer.WriteStartElement(new Row { RowIndex = rowIndex });

            for (int colInx = 0; colInx < numberOfColumns; colInx++)
            {
                cellValue = dr.ItemArray[colInx].ToString();

                if (IsNumericColumn[colInx])
                {

                    cellNumericValue = 0;
                    if (double.TryParse(cellValue, out cellNumericValue))
                    {
                        cellValue = cellNumericValue.ToString();
                        AppendNumericCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer);
                    }
                }
                else
                {

                    AppendTextCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer);
                }
            }
            writer.WriteEndElement(); 
        }
        writer.WriteEndElement(); 
        writer.WriteEndElement(); 

        writer.Close();
   }

   private static void AppendTextCell(string cellReference, string cellStringValue, ref OpenXmlWriter writer)
   {

        writer.WriteElement(new Cell { CellValue = new CellValue(cellStringValue), CellReference = cellReference, DataType = CellValues.String });
   }

在下面提到的方法中,我遇到了异常错误..

  private static void AppendTextCell(string cellReference, string cellStringValue, ref OpenXmlWriter writer)
  {           
       writer.WriteElement(new Cell { CellValue = new CellValue(cellStringValue), CellReference = cellReference, DataType = CellValues.String });
  }

在导出到 excel 数据时,任何人都可以帮助解决这个错误....

提前非常感谢..

【问题讨论】:

  • 您应该使用&gt; 来格式化错误并让您的代码左对齐。
  • 也许你需要使用stackoverflow.com/questions/6468783/…中描述的CellValues.InlineString
  • @MikeHixson 对不起内联字符串我也遇到了同样的问题....

标签: c# .net excel openxml openxml-sdk


【解决方案1】:

XML 几乎可以处理任何字符,但有些范围、控制代码等它不会。

如果你不能让他们修复他们的输出,你最好的选择是清理你收到的原始数据。您需要将非法字符替换为您记下的字符引用格式。

有很多符号不能在 xml 代码中。为了替换它们,我们可以使用 Reqex.Replace

static string ReplaceHexadecimalSymbols(string txt)
{
   string r = "[\x00-\x08\x0B\x0C\x0E-\x1F\x26]";
   return Regex.Replace(txt, r,"",RegexOptions.Compiled);
}

【讨论】:

  • 嗯谢谢 .. 我需要在我的代码中使用这个替换
  • 调用此函数,将数据写入 excel 以替换要在 excel 中插入的字符串。
  • 像这样............ cellValue = ReplaceHexadecimalSymbols (dr.ItemArray[colInx].ToString())
  • 只是一个建议 - 编译一次正则表达式,然后调用 Replace 方法。这将提高性能。静态正则表达式 regexReplaceHex = new Regex("[\x00-\x08\x0B\x0C\x0E-\x1F\x26]", RegexOptions.Compiled);静态字符串 ReplaceHexadecimalSymbols(string txt) { if (!string.IsNullOrEmpty(txt)) return regexReplaceHex.Replace(txt, string.Empty); }
【解决方案2】:

x26 是和号“&”字符 - 可以用“&”编码,以便它出现在您的 Excel 工作表中。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2018-05-30
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2012-06-17
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多