2016-08-21 5 views
0

セルの色、フォントスタイル、枠線、セルのサイズなどのセルフォーマットを取得し、C#を使用してxmlファイルとして保存する方法はありますか?C#を使用してExcelファイルのセルフォーマットを取得する

私はすでにセルの値を取得してxmlで変換するコードを持っていますが、各セルのフォーマットは取得できません。ありがとうございました。

public class ConvertExcelToXml 
{ 
    /// <summary> 
    /// Read Data from selected excel file into DataTable 
    /// </summary> 
    /// <param name="filename">Excel File Path</param> 
    /// <returns></returns> 
    private DataTable ReadExcelFile(string filename) 
    { 
     // Initialize an instance of DataTable 
     DataTable dt = new DataTable(); 

     try 
     { 
      // Use SpreadSheetDocument class of Open XML SDK to open excel file 
      using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, false)) 
      { 
       // Get Workbook Part of Spread Sheet Document 
       WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart; 

       // Get all sheets in spread sheet document 
       IEnumerable<Sheet> sheetcollection = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>(); 

       // Get relationship Id 
       string relationshipId = sheetcollection.First().Id.Value; 

       // Get sheet1 Part of Spread Sheet Document 
       WorksheetPart worksheetPart = (WorksheetPart)spreadsheetDocument.WorkbookPart.GetPartById(relationshipId); 

       // Get Data in Excel file 
       SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First(); 
       IEnumerable<Row> rowcollection = sheetData.Descendants<Row>(); 

       if (rowcollection.Count() == 0) 
       { 
        return dt; 
       } 

       // Add columns 
       foreach (Cell cell in rowcollection.ElementAt(0)) 
       { 
        dt.Columns.Add(GetValueOfCell(spreadsheetDocument, cell)); 
       } 

       // Add rows into DataTable 
       foreach (Row row in rowcollection) 
       { 
        DataRow temprow = dt.NewRow(); 
        int columnIndex = 0; 
        foreach (Cell cell in row.Descendants<Cell>()) 
        { 
         // Get Cell Column Index 
         int cellColumnIndex = GetColumnIndex(GetColumnName(cell.CellReference)); 

         if (columnIndex < cellColumnIndex) 
         { 
          do 
          { 
           temprow[columnIndex] = string.Empty; 
           columnIndex++; 
          } 

          while (columnIndex < cellColumnIndex); 
         } 

         temprow[columnIndex] = GetValueOfCell(spreadsheetDocument, cell); 
         columnIndex++; 
        } 

        // Add the row to DataTable 
        // the rows include header row 
        dt.Rows.Add(temprow); 
       } 
      } 

      // Here remove header row 
      dt.Rows.RemoveAt(0); 
      return dt; 
     } 
     catch (IOException ex) 
     { 
      throw new IOException(ex.Message); 
     } 
    } 

    /// <summary> 
    /// Get Value of Cell 
    /// </summary> 
    /// <param name="spreadsheetdocument">SpreadSheet Document Object</param> 
    /// <param name="cell">Cell Object</param> 
    /// <returns>The Value in Cell</returns> 
    private static string GetValueOfCell(SpreadsheetDocument spreadsheetdocument, Cell cell) 
    { 
     // Get value in Cell 
     SharedStringTablePart sharedString = spreadsheetdocument.WorkbookPart.SharedStringTablePart; 
     if (cell.CellValue == null) 
     { 
      return string.Empty; 
     } 

     string cellValue = cell.CellValue.InnerText; 

     // The condition that the Cell DataType is SharedString 
     if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) 
     { 
      return sharedString.SharedStringTable.ChildElements[int.Parse(cellValue)].InnerText; 
     } 
     else 
     { 
      return cellValue; 
     } 
    } 

    /// <summary> 
    /// Get Column Name From given cell name 
    /// </summary> 
    /// <param name="cellReference">Cell Name(For example,A1)</param> 
    /// <returns>Column Name(For example, A)</returns> 
    private string GetColumnName(string cellReference) 
    { 
     // Create a regular expression to match the column name of cell 
     Regex regex = new Regex("[A-Za-z]+"); 
     Match match = regex.Match(cellReference); 
     return match.Value; 
    } 

    /// <summary> 
    /// Get Index of Column from given column name 
    /// </summary> 
    /// <param name="columnName">Column Name(For Example,A or AA)</param> 
    /// <returns>Column Index</returns> 
    private int GetColumnIndex(string columnName) 
    { 
     int columnIndex = 0; 
     int factor = 1; 

     // From right to left 
     for (int position = columnName.Length - 1; position >= 0; position--) 
     { 
      // For letters 
      if (Char.IsLetter(columnName[position])) 
      { 
       columnIndex += factor * ((columnName[position] - 'A') + 1) - 1; 
       factor *= 26; 
      } 
     } 

     return columnIndex; 
    } 

    /// <summary> 
    /// Convert DataTable to Xml format 
    /// </summary> 
    /// <param name="filename">Excel File Path</param> 
    /// <returns>Xml format string</returns> 
    public string GetXML(string filename) 
    { 
     using (DataSet ds = new DataSet()) 
     { 
      ds.Tables.Add(this.ReadExcelFile(filename)); 
      return ds.GetXml(); 
     } 
    } 
} 

答えて

1

あなたはあなたの細胞の表現にMicrosoft.Office.Interop.Excel.Rangeを使用していて、あなたはそれがrowNumbercolumnNumberだ持っている場合。

string FontName = ((Range) worksheet.Cells[rowNumber,columnNumber]).Style.Font.Name 
int FontSize = System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).Style.Font.Size); 

ボーダー(サイズ、スタイル):

int size = System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).Borders.Weight); 
Excel.XlLineStyle style = ((Range) worksheet.Cells[rowNumber,columnNumber]).Borders.LineStyle; 

列幅/高さ:

色用の

:フォントスタイル(のFontName、のFontSize)については

int colorNumber = System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).Interior.Color); 
Color color = System.Drawing.ColorTranslator.FromOle(colorNumber); 

int width = System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).EntireColumn.ColumnWidth); 
int height= System.Convert.ToInt32(((Range) worksheet.Cells[rowNumber,columnNumber]).EntireColumn.ColumnHeight); 
+0

こんにちは@Jan Walczak、私は使用しているコードでスレッドを更新しました。私の問題は、あなたが与えたコードをどこに置くべきかわかりません。ありがとう –

+0

ちょうどあなたの細胞を取る。ある時点であなたは細胞の物体を持っています。そのrownumberとcolumnnumberを使用して、それらをコードiで使用することができます。あなたが望むように、あなたは欲しい。 – Whencesoever

関連する問題