C# 导出到excel数据时出错:'';,十六进制值0x07是使用c的无效字符#
我在尝试将剑道ui网格中的数据导出到excel时遇到了奇怪的问题 错误: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
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);}