C# 导出到excel数据时出错:'';,十六进制值0x07是使用c的无效字符#

C# 导出到excel数据时出错:'';,十六进制值0x07是使用c的无效字符#,c#,.net,excel,openxml,openxml-sdk,C#,.net,Excel,Openxml,Openxml Sdk,我在尝试将剑道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的方法 priv

我在尝试将剑道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 });
   }
请任何人在导出excel数据时帮助克服此错误


非常感谢。

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

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

x26是符号“&”字符-可以用“&”进行编码,以便在excel工作表中显示。

x26是符号“&”字符-可以用“&”进行编码,以便在excel工作表中显示。

您应该使用
设置错误格式并使代码保持对齐。可能需要使用CellValues.InlineString正如@MikeHixson抱歉内联字符串中所述,我也遇到了同样的问题…您应该使用
格式化错误并使代码左对齐。也许您需要使用CellValues.InlineString,正如@MikeHixson抱歉内联字符串中所述,我也遇到了同样的问题…嗯,谢谢。。当我需要在代码中使用此替换时,调用此函数,将数据写入excel以替换要插入excel中的字符串。如下所示。。。。。。。。cellValue=ReplaceHexadecimalSymbols(dr.ItemArray[colInx].ToString())只是一个建议-编译正则表达式一次,然后调用Replace方法。这将提高性能。静态正则表达式regexreplacehx=newregex([\x00-\x08\x0B\x0C\x0E-\x1F\x26]”,RegexOptions.Compiled);静态字符串替换十六进制符号(字符串txt){if(!string.IsNullOrEmpty(txt))返回regexReplaceHex.Replace(txt,string.Empty);}hmm谢谢。。当我需要在代码中使用此替换时,调用此函数,将数据写入excel以替换要插入excel中的字符串。如下所示。。。。。。。。cellValue=ReplaceHexadecimalSymbols(dr.ItemArray[colInx].ToString())只是一个建议-编译正则表达式一次,然后调用Replace方法。这将提高性能。静态正则表达式regexreplacehx=newregex([\x00-\x08\x0B\x0C\x0E-\x1F\x26]”,RegexOptions.Compiled);静态字符串替换十六进制符号(字符串txt){if(!string.IsNullOrEmpty(txt))返回regexReplaceHex.Replace(txt,string.Empty);}