2017-03-03 1 views
1

ExporToExcel 클래스에서 SheetView 설정을 추가해야합니다. 그러나 내보내기 후에 워크 시트가 만들어지고 SheetView 설정이 설정되어 있어도 Excel 셀 내용이 비어 있음을 보여줍니다. 이 사이트의 게시물과 다른 사이트의 게시물을 모두 확인했지만 성공하지 못했습니다. 문서가 손상 될 때마다 또는 스프레드 시트가 비어있을 때마다Open XML Sheetview 오른쪽에서 왼쪽

private static void WriteExcelFile(DataSet ds, SpreadsheetDocument spreadsheet) 
{ 
    spreadsheet.AddWorkbookPart(); 
    spreadsheet.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); 

    spreadsheet.WorkbookPart.Workbook.Append(new BookViews(new WorkbookView())); 

    WorkbookStylesPart workbookStylesPart = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>("rIdStyles"); 
    //Stylesheet stylesheet = new Stylesheet(); 
    workbookStylesPart.Stylesheet = CreateStylesheet(); 

    uint worksheetNumber = 1; 
    Sheets sheets = spreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 
    foreach (DataTable dt in ds.Tables) 
    { 
     string worksheetName = dt.TableName; 
     WorksheetPart newWorksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>(); 
     Sheet sheet = new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart), SheetId = worksheetNumber, Name = worksheetName }; 
     newWorksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView() { WorkbookViewId=0,RightToLeft=true}),new SheetData()); 
     newWorksheetPart.Worksheet.Save(); 

     sheets.Append(sheet); 

     WriteDataTableToExcelWorksheet(dt, newWorksheetPart); 

     worksheetNumber++; 
    } 
    spreadsheet.WorkbookPart.Workbook.Save(); 
} 

private static void WriteDataTableToExcelWorksheet(DataTable dt, WorksheetPart worksheetPart) 
{ 
    OpenXmlWriter writer = OpenXmlWriter.Create(worksheetPart, Encoding.ASCII); 
    writer.WriteStartElement(new Worksheet()); 
    writer.WriteStartElement(new SheetData()); 

    string cellValue = ""; 

    int numberOfColumns = dt.Columns.Count; 
    bool[] IsNumericColumn = new bool[numberOfColumns]; 
    bool[] IsDateColumn = new bool[numberOfColumns]; 

    string[] excelColumnNames = new string[numberOfColumns]; 
    for (int n = 0; n < numberOfColumns; n++) 
     excelColumnNames[n] = GetExcelColumnName(n); 

    // 
    // Create the Header row in our Excel Worksheet 
    // 
    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"); 
     IsDateColumn[colInx] = (col.DataType.FullName == "System.DateTime"); 
    } 
    writer.WriteEndElement(); // End of header "Row" 

    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(); 
      cellValue = ReplaceHexadecimalSymbols(cellValue); 
      if (IsNumericColumn[colInx]) 
      { 
       cellNumericValue = 0; 
       if (double.TryParse(cellValue, out cellNumericValue)) 
       { 
        cellValue = cellNumericValue.ToString(); 
        AppendNumericCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer); 
       } 
      } 
      else if (IsDateColumn[colInx]) 
      { 
       // This is a date value. 
       DateTime dtValue; 
       string strValue = ""; 
       if (DateTime.TryParse(cellValue, out dtValue)) 
        strValue = dtValue.ToShortDateString(); 
       AppendTextCell(excelColumnNames[colInx] + rowIndex.ToString(), strValue, ref writer); 
      } 
      else 
      { 
       AppendTextCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer); 
      } 
     } 
     writer.WriteEndElement(); // End of Row 
    } 
    writer.WriteEndElement(); // End of SheetData 
    writer.WriteEndElement(); // End of worksheet 

    writer.Close(); 
} 

답변

0

시트를 RightToLeft 시트로 읽는 코드가 올바른지 확인하는 코드입니다. 그러나 WriteDataTableToExcelWorksheetCreateStylesheet 코드는 완전하지 않으며 몇 가지 문제가있었습니다.

WriteDataTableToExcelWorksheet의 원본 코드를 this link에 있습니다. 그런 다음 Open XML Productivity Tool을 사용하여 일반 Excel 파일을 C# 코드로 바꾸어 새 스타일 시트를 만드는 방법을 다시 사용했습니다. 이 코드 생성

Excel 파일이 여기에 표시됩니다 : enter image description here

I've pushed this new code to GitHub합니다. 컴퓨터에서 파일을 생성 할 위치를 안내하는 래퍼 WPF 응용 프로그램이 있습니다.

여기에 guide on installing the Open XML Productivity Tool입니다.

관련 문제