2015-09-09 2 views
1

Я пытаюсь экспортировать данный datatable в файл xlsx с помощью открытого xml.open xml error: Формат данного пути не поддерживается

Я написал следующий код:

private void ExportToExcelFileOpenXML(DataTable dt, string destination) 
{ 
    DataSet ds = new DataSet(); 
    DataTable dtCopy = new DataTable(); 
    dtCopy = dt.Copy(); 
    ds.Tables.Add(dtCopy); 
    using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) 
    {   

     var workbookPart = workbook.AddWorkbookPart(); 

     workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); 

     workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); 

     foreach (System.Data.DataTable table in ds.Tables) 
     { 

      var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); 
      var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData(); 
      sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData); 

      DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); 
      string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); 

      uint sheetId = 1; 
      if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) 
      { 
       sheetId = 
        sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
      } 

      DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName }; 
      sheets.Append(sheet); 

      DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 

      List<String> columns = new List<string>(); 
      foreach (System.Data.DataColumn column in table.Columns) 
      { 
       columns.Add(column.ColumnName); 

       DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 
       cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
       cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); 
       headerRow.AppendChild(cell); 
      } 


      sheetData.AppendChild(headerRow); 

      foreach (System.Data.DataRow dsrow in table.Rows) 
      { 
       DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 
       foreach (String col in columns) 
       { 
        DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 
        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // 
        newRow.AppendChild(cell); 
       } 

       sheetData.AppendChild(newRow); 
      } 
     } 
    } 
} 

В этой функции я получаю ошибку:

using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) 

Ошибка:

An exception of type 'System.NotSupportedException' occurred in mAn exception of type 'System.NotSupportedException' occurred in mscorlib.dll but was not handled in user code

Additional information: The given path's format is not supported. 

переменная назначения имеет значение:

IncorrectRecordsUploaded_9/9/2015 9:48:23 AM.xlsx

Как я могу устранить эту ошибку?

Я попытался:

destination.replace("/","//"); 

Но та же ошибка идет по этой линии.

Когда я переименовал файл в IncorrectRecordsUploaded.xlsx он начал бросать меня:

An exception of type 'System.UnauthorizedAccessExAn exception of type 'System.UnauthorizedAccessException' occurred in WindowsBase.dll but was not handled in user code

Additional information: Access to the path 'C:\Program Files (x86)\IIS Express\IncorrectRecordsUploaded.xlsx' is denied.

ответ

1

Вы desrcibed две различные ошибки.

Первая ошибка произошла из-за недействительных символов имени файла. Есть несколько символов, которые deniend в наименовании: <, >, :, ", /, \, |, ?, *. Также вы можете проверить правила для naming files and folders на MSDN.

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

using System.IO; 
using System.Text.RegularExpressions; 

var pattern = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); 
var r = new Regex(string.Format("[{0}]", Regex.Escape(pattern))); 
tempFileName = r.Replace(tempFileName, "_"); 

Вашей второй ошибка произошла потому, что вы не доступ к этому пути. Попробуйте сохранить файл в другом месте (Documents или просто C:/).

Смежные вопросы