C#ExcelLibraryを使用したExcelファイルの読み書き

8991 ワード

ExcelLibraryは比較的洗練されたExcel読み書きコンポーネントなのか、それとも国人が開発したのか、ダウンロードアドレス:http://code.google.com/p/excellibrary/.xlsとxlsx形式のExcelを読み書きできます.简単な公式をサポートして、画像を挿入することができて、フォーマットの设定に対してもそんなに豊富ではありませんて、セルの幅を设定することができて、データのフォーマットの表示.フォント、前景、背景色を設定するのは限界です.NPOIには及ばないが、純粋なデータを読み書きするためのコンパクトなExcelとしては効率的だ.
具体的な例は、そのテストコード:ExcelLibrary.TestSimpleTest.csを見ることができます.ここ
 
Excelファイルの書き込み:
using System;

using ExcelLibrary.SpreadSheet;

 

class ExcelLibraryTest

{

    public static void Main(string[] args)

    {

 

        Workbook workbook = new Workbook();

        Worksheet worksheet = new Worksheet("Persons");

 

        worksheet.Cells[0, 0] = new Cell("ID");

        worksheet.Cells[0, 1] = new Cell("Name");

        worksheet.Cells[0, 2] = new Cell("Age");

     //     
     worksheet.Cells.ColumnWidth[(ushort)0] = 3200;
    
worksheet.Cells.ColumnWidth[(ushort)1] = 3200;  
     worksheet.Cells.ColumnWidth[(ushort)2] = 3200;  
            
     worksheet.Cells[
1, 0] = new Cell("1");
   worksheet.Cells[
1, 1] = new Cell("Unmi");
     worksheet.Cells[
1, 2] = new Cell("xxx");

     // //worksheet.AddPicture; worksheet.ExtractPicture;worksheet.Cells.ColumnWidth
     workbook.Worksheets.Add(worksheet);
     workbook.Save(
@"c:\test.xls"); } }

Excelファイルを読む:
using System;

using System.IO;

using ExcelLibrary.SpreadSheet;

 

class ExcelLibraryTest

{

    public static void Main(string[] args)

    {

        FileStream fileStream = new FileStream(@"c:\test.xls", FileMode.Open);

 

        Workbook workbook = Workbook.Load(fileStream);

 

        //          ,     Stream was not writable.  

        //Workbook workbook = Workbook.Load(@"c:\test.xls");

 

        Worksheet worksheet = workbook.Worksheets[0];

 

        for (int i = 0; i <= worksheet.Cells.LastRowIndex; i++)

        {

            for (int j = 0; j <= worksheet.Cells.LastColIndex; j++)

            {

                Console.Write(worksheet.Cells[i, j].Value);

                if (j < worksheet.Cells.LastColIndex)

                    Console.Write(", ");

            }

            Console.WriteLine();

        }

 

        fileStream.Close();

 

        Console.Write("Press any key to continue . . . ");

        Console.ReadKey(true);

    }

}

上のコードでは、Workbook.Load(filename)でStream was not writableを報告していますが、問題の原因は書けないストリームを書こうとしているからです.この行のコードから追跡すると、次の文でファイルを開きます.
        public static Workbook Load(string file)        {            return Load(File.OpenRead(file));        }
OpenRead()は読み取り専用のものだと仮定していますが、厚かましくないようです.データを読みたいのでしょうか.ファイルを書くにはWorkbook.Save(filename)の方法があるのではないでしょうか.しかし、さらに下に行くと、方法CompoundDocument.CompoundDocument(Stream stream,FileHeader header)に移ります.
            this.FileStorage = stream;            this.Reader = new BinaryReader(this.FileStorage);            this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);
動機はそんなに単純ではありません.ここのFilteStorageやstreamは、前にFile.OpenRead(file)で得たもので、このstreamのCanWrite属性はfalseです.
解決策は2つありますが、書き込み可能なファイルストリームを開くか、Workbook.Save()メソッドを使用するので、BinaryWriterを作成する前に判断する必要があります.以下のようにします.
            if(this.FileStorage.CanWrite)            {                    this.Writer = new BinaryWriter(this.FileStorage, Encoding.Unicode);            }
これには、Workbook.Load(fileStream)を使用する場合、ファイルストリームを直接Loadする場合も、HTTPでExcelファイルをアップロードするときにその内容を読み出す必要があります.私たちが入手できるFileUpload.FileContentは、HttpInputStreamであり、書くことができるBinaryWriterを作成することはできません.
この書けるかどうかの判断を加えて、使いたいダイナミックライブラリに再コンパイルすればいいのです.また、ExcelLibraryにはDataSet Helperクラスの小さな改造があり、ExcelからDataSetやDataTableを生成するのに使えます.もういくつかのリロード方法が便利になるはずです.
public static DataTable CreateDataTable(String filePath, int sheetIndex)public static DataTable CreateDataTable(Stream stream, String sheetName)public static DataTable CreateDataTable(Stream stream, int sheetIndex)public static DataSet CreateDataSet(Stream stream)
最後に、プロジェクトは長い間あまりメンテナンスされていないようで、フォーマット、スタイルのコントロールを強化したいと思っています.
参考:1.  Asp.net ExcelLibraryでEXCELを出力         2.  Excel Reader Create, read and modify Excel *.xls files in pure C# without COM interop