2017-04-30 11 views
0

Excel interop dllを使用してExcelファイルをHTMLファイルにエクスポートするアプリケーションを作成します。 1つのキャッチは、.HTMLファイルのプレビューがExcelで表示されているかのように現実に近いかどうかを確認したいということです。初期フォーマットに基づいてセルをフォーマットする[非常に遅い]

通常、ExcelファイルをHTMLファイルとしてエクスポートするときには、枠線や「グリッド線」は表示されません。 Excelはcoloured cells, grid lines are not shown.

をレンダリングする際に、この問題を解決するにはyou must add your own borders.

は、しかし、私は、「何の塗りつぶし」を持っていないセルに境界線を追加するには、C#のコードの下に書いた:

using Microsoft.Office.Interop.Excel; 

namespace CS_HelloExcel 
{ 
    class Program 
    { 
     static void Main() 
     { 
      //Create excel application: 
      Application application = new Application(); 

      //Define filename "C:\Users\sancarn\Documents\" 
      String filename = "C:\\Users\\sancarn\\Documents\\myFormatedXL.xlsx"; 

      //Open workbook as read only, don't update links 
      Workbook workbook = application.Workbooks.Open(filename, false, true); 

      foreach (Worksheet sheet in workbook.Sheets) 
      { 
       Range ur = sheet.UsedRange; 
       ur = ur.Resize[ur.Rows.Count + 1, ur.Columns.Count + 1]; 

       //Create individual cells where blank cells originally occur - Takes 0.2s 
       ur.Replace("", "'"); 

       // Takes 3.4s 
       foreach(Range cell in ur.Cells) 
       { 
        if(cell.Interior.Pattern == -4142) 
        { 
         Borders b = cell.Borders; 
         b[XlBordersIndex.xlEdgeBottom].LineStyle= XlLineStyle.xlContinuous; 
         b[XlBordersIndex.xlEdgeBottom].ThemeColor = 3; 
         b[XlBordersIndex.xlEdgeBottom].Weight = 2; 
         b[XlBordersIndex.xlEdgeLeft].LineStyle= XlLineStyle.xlContinuous; 
         b[XlBordersIndex.xlEdgeLeft].ThemeColor = 3; 
         b[XlBordersIndex.xlEdgeLeft].Weight = 2; 
         b[XlBordersIndex.xlEdgeRight].LineStyle= XlLineStyle.xlContinuous; 
         b[XlBordersIndex.xlEdgeRight].ThemeColor = 3; 
         b[XlBordersIndex.xlEdgeRight].Weight = 2; 
         b[XlBordersIndex.xlEdgeTop].LineStyle= XlLineStyle.xlContinuous; 
         b[XlBordersIndex.xlEdgeTop].ThemeColor = 3; 
         b[XlBordersIndex.xlEdgeTop].Weight = 2; 
        } 
       } 
      } 

      //Save workbook as html file takes 0.5s 
      application.DisplayAlerts = false; 
      workbook.SaveAs("myFormatedXL.html",XlFileFormat.xlHtml); 

      //Get workbook path 
      String path = workbook.FullName; 

      //Close application 
      workbook.Close(false); 
      application.Quit(); 

      //Free up memory 
      application = null; 
     } 
    } 
} 

コメントに示すがようすべての細胞のループは3.5秒かかります...私はこの仕事をどのようにスピードアップできるか誰かが知っているのだろうか?

+0

xlsxファイルを使用している場合は、interopクラスの使用を中止し、Microsoftのopen xml sdkを使用してください。 –

+0

@ScottChamberlainすべてのExcel形式が理想的です。しかし、私はそれについていくつかのチェックを追加することができます:)私の友人はまた、xlsx形式のhttps://epplus.codeplex.com/を提案しました。 – Sancarn

+0

ClosedXMLはxlsxと対話する素晴らしいライブラリです。残念ながら、古いxls形式はサポートしていません。 –

答えて

0

このオプションでは、より良い結果を持っているようだ:

//Takes 0ms? 
Range b=null; 
foreach(Range cell in ur.Cells) 
{ 
    if(cell.Interior.Pattern == -4142) 
    { 
     b = b!=null ? application.Union(b, cell) : cell; 
    } 
} 

b.Borders[XlBordersIndex.xlEdgeBottom].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlEdgeBottom].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlEdgeBottom].Weight = 2; 
b.Borders[XlBordersIndex.xlEdgeTop].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlEdgeTop].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlEdgeTop].Weight = 2; 
b.Borders[XlBordersIndex.xlEdgeLeft].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlEdgeLeft].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlEdgeLeft].Weight = 2; 
b.Borders[XlBordersIndex.xlEdgeRight].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlEdgeRight].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlEdgeRight].Weight = 2; 
b.Borders[XlBordersIndex.xlInsideHorizontal].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlInsideHorizontal].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlInsideHorizontal].Weight = 2; 
b.Borders[XlBordersIndex.xlInsideVertical].LineStyle = XlLineStyle.xlContinuous; 
b.Borders[XlBordersIndex.xlInsideVertical].ThemeColor = 3; 
b.Borders[XlBordersIndex.xlInsideVertical].Weight = 2; 

まず、フォーマットする必要があります範囲を作り、その後、その後、私たちは、書式設定を適用します。しかし、何らかの理由により、この結果として生じる書式設定は、結果のhtmlファイルでは奇妙です。

代わりにCSSでこれを行うことができます。

関連する問題