2014-06-16 1 views
0

у меня странная проблема, когда я пытаюсь экспортировать данные в кендо UI сетки, чтобы преуспеть .....ошибка при экспорте данных Excel: «», шестнадцатеричное значение 0x07, это неверный символ, используя C#

Ошибка:

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. 

и ниже метод я использовал для экспорта, чтобы преуспеть

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 ....

Большое спасибо заранее ..

+0

Вы должны использовать '>' для форматирования ошибок и выравнивания кода. – paqogomez

+0

Возможно, вам нужно использовать CellValues.InlineString, как описано в http://stackoverflow.com/questions/6468783/what-is-the-difference-between-cellvalues-inlinestring-and-cellvalues-string-in –

+0

@MikeHixson sorry inline string также я получаю такую ​​же проблему .... –

ответ

2

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

hmm thanks .. где мне нужно использовать эту замену в моем коде –

+0

вызывать эту функцию, где вы пишете данные, чтобы перенести, чтобы заменить строку, которую вы хотите вставить в excel. –

+0

вот так ........ cellValue = ReplaceHexadecimalSymbols (dr.ItemArray [colInx] .ToString()) –

0

x26 является амперсанд «&» характер - это может быть закодирован с «&», так что она появляется в Excel лист.