2011-03-04 33 views
1

我使用下面鏈接中的代碼使用Open XML將數據導出到Excel。使用Open XML導出到Excel。但最後一個單元格沒有填滿

http://openxmldeveloper.org/forums/permalink/123327/8373/ShowThread.aspx#8373

的代碼是在VB.Net所以它轉換爲C#。它工作正常只有一個(煩人的)故障。最後一個單元(Z5)是空白的。當我使用vb.net版本的代碼填充所有的單元格時。我手動比較了C#和VB.Net代碼,但是它的功能類似於逐字節的字節。但它仍然無法填滿最後一個單元格。任何想法爲什麼?

C#代碼的版本,下面是供你參考:

protected void Export() 
{ 
    Response.ClearHeaders(); 
    Response.ClearContent(); 
    Response.Clear(); 
    Response.Buffer = true; 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; 
    //"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" '"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" '"application/vnd.ms-excel" 
    Response.AddHeader("content-disposition", "attachment; filename=Test.xlsx"); 
    Response.Charset = ""; 
    this.EnableViewState = false; 
    MemoryStream ms = new MemoryStream(); 
    SpreadsheetDocument objSpreadsheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook); 
    WorkbookPart objWorkbookPart = objSpreadsheet.AddWorkbookPart(); 
    objWorkbookPart.Workbook = new Workbook(); 
    WorksheetPart objSheetPart = objWorkbookPart.AddNewPart<WorksheetPart>(); 
    objSheetPart.Worksheet = new Worksheet(new SheetData()); 
    Sheets objSheets = objSpreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 
    Sheet objSheet = new Sheet(); 
    objSheet.Id = objSpreadsheet.WorkbookPart.GetIdOfPart(objSheetPart); 
    objSheet.SheetId = 1; 
    objSheet.Name = "mySheet"; 
    objSheets.Append(objSheet); 

    for (int intRow = (int)('A'); intRow <= (int)('Z'); intRow++) 
    { 
     for (uint intCol = 1; intCol <= 5; intCol++) 
     { 
      Cell objCell = InsertCellInWorksheet(Convert.ToString((char)intRow), intCol, objSheetPart); 
      objCell.CellValue = new CellValue("This was a test: " + Convert.ToString((char)intRow) + intCol.ToString()); 
      objCell.DataType = new EnumValue<CellValues>(CellValues.String); 
      objSpreadsheet.WorkbookPart.Workbook.Save(); 
     } 
    } 


    objSpreadsheet.WorkbookPart.Workbook.Save(); 
    objSpreadsheet.Close(); 
    ms.WriteTo(Response.OutputStream); 
    Response.Flush(); 
    Response.End(); 
} 

private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart) 
{ 
    Worksheet worksheet = worksheetPart.Worksheet; 
    var sheetData = worksheet.GetFirstChild<SheetData>(); 
    string cellReference = columnName + rowIndex; 

    // If the worksheet does not contain a row with the specified row index, insert one. 
    Row row; 
    if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) 
    { 
     row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First(); 
    } 
    else 
    { 
     row = new Row { RowIndex = rowIndex }; 
     sheetData.Append(row); 
    } 

    // If there is not a cell with the specified column name, insert one. 
    if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0) 
    { 
     return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First(); 
    } 
    // Cells must be in sequential order according to CellReference. Determine where to insert the new cell. 
    Cell refCell = row.Elements<Cell>().FirstOrDefault(cell => string.Compare(cell.CellReference.Value, cellReference, true) > 0); 

    var newCell = new Cell { CellReference = cellReference }; 
    row.InsertBefore(newCell, refCell); 

    worksheet.Save(); 
    return newCell; 
} 

回答

2

問題已解決。 o使代碼正常工作。而不是將該工作表保存在InsertCellInWorksheet方法中。我將表格保存在for循環之外。這是代碼的工作版本。

protected void Export() 
{ 
    Response.ClearHeaders(); 
    Response.ClearContent(); 
    Response.Clear(); 
    Response.Buffer = true; 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"; 
    //"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" '"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" '"application/vnd.ms-excel" 
    Response.AddHeader("content-disposition", "attachment; filename=Test.xlsx"); 
    Response.Charset = ""; 
    this.EnableViewState = false; 
    MemoryStream ms = new MemoryStream(); 
    SpreadsheetDocument objSpreadsheet = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook); 
    WorkbookPart objWorkbookPart = objSpreadsheet.AddWorkbookPart(); 
    objWorkbookPart.Workbook = new Workbook(); 
    WorksheetPart objSheetPart = objWorkbookPart.AddNewPart<WorksheetPart>(); 
    objSheetPart.Worksheet = new Worksheet(new SheetData()); 
    Sheets objSheets = objSpreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 
    Sheet objSheet = new Sheet(); 
    objSheet.Id = objSpreadsheet.WorkbookPart.GetIdOfPart(objSheetPart); 
    objSheet.SheetId = 1; 
    objSheet.Name = "mySheet"; 
    objSheets.Append(objSheet); 

    for (int intRow = (int)('A'); intRow <= (int)('Z'); intRow++) 
    { 
     for (uint intCol = 1; intCol <= 5; intCol++) 
     { 
      Cell objCell = InsertCellInWorksheet(Convert.ToString((char)intRow), intCol, objSheetPart); 
      objCell.CellValue = new CellValue("This was a test: " + Convert.ToString((char)intRow) + intCol.ToString()); 
      objCell.DataType = new EnumValue<CellValues>(CellValues.String); 
     } 
    } 
    objSheetPart.Worksheet.Save(); 
    objSpreadsheet.WorkbookPart.Workbook.Save(); 
    objSpreadsheet.Close(); 
    ms.WriteTo(Response.OutputStream); 
    Response.Flush(); 
    Response.End(); 
} 

private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart) 
{ 
    Worksheet worksheet = worksheetPart.Worksheet; 
    var sheetData = worksheet.GetFirstChild<SheetData>(); 
    string cellReference = columnName + rowIndex; 

    // If the worksheet does not contain a row with the specified row index, insert one. 
    Row row; 
    if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) 
    { 
     row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First(); 
    } 
    else 
    { 
     row = new Row { RowIndex = rowIndex }; 
     sheetData.Append(row); 
    } 

    // If there is not a cell with the specified column name, insert one. 
    if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0) 
    { 
     return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First(); 
    } 
    // Cells must be in sequential order according to CellReference. Determine where to insert the new cell. 
    Cell refCell = row.Elements<Cell>().FirstOrDefault(cell => string.Compare(cell.CellReference.Value, cellReference, true) > 0); 

    var newCell = new Cell { CellReference = cellReference }; 
    row.InsertBefore(newCell, refCell); 

    //worksheet.Save(); 
    return newCell; 
} 

不知道它在VB.Net如何工作:-)

0

的環通,你必須看起來不正確的行和列。它看起來像循環行= 65(即(int)('A')到行= 65 + 26(即(int)('Z')),然後col = 1到3. 也許你應該循環從col = 1到5.
我認爲你可能需要看看你正在處理的xml,並確保你正確地瀏覽文檔(行和列)。如果你不知道這一切office 2007和更高版本的文檔都是openXML文檔,基本上都是包含xml的zip文件,如果您將電子表格和擴展名從.xlsx更改爲.zip,則可以將該文檔作爲zip文件打開並瀏覽內容。我一直沒有使用openXml一年多,但如果我的記憶正確地爲我服務,你會發現代表工作表文件夾中的表格的xml。

+0

感謝響應。現在這個問題已經解決了。請參閱我的回答以獲取答案。 – Sajid 2011-03-04 06:54:23

相關問題