0

政府のHHS部門からのExcel2003スプレッドシートを読む必要があります。XLSは、セル、パスワードで保護されたマクロ、およびフォームコントロール(ボタン、ドロップダウンなど)をマージしました。

要件は次のとおりです。

Excelがインストールされていないサーバーでこれを実際に読む必要があります。

セルの結合に問題があり、データがドロップされるため、OLE4ドライバーを使用できません。あるいは、フォームコントロールのような何かがそれを捨てているのかもしれません。

Excelを使用すると、パスワードで保護されたスプレッドシートをXMLとして保存できなくなり、パスワードを取得できなくなります。

Excel 2007および2010を使用してXLSXとして保存し、ACEOLEExcelドライバーを使用してみました。セルの結合は問題ではないようですが、フォームコントロールは問題です(おそらく、JETドライバーを使用した場合も問題でした)。

ネイティブBIFF形式を読み取るCodeProjectのサンプルプロジェクトを試しましたが、2003年には問題なく動作しましたが、2007年と2010年に窒息し、すぐにアップグレードする可能性があるため、すぐに廃止される予定はありません。

このスプレッドシートを読み取る可能性のあるネイティブXLS形式を読み取るための、信頼性が高く、企業責任に適した優れたオープンソースライブラリはありますか?それとも、サードパーティ製品を購入する必要があるか、取得する必要があるかをマネージャーに納得させる必要があるかどうかを判断する必要がありますか?サーバーにExcelをインストールするためのピタ企業の例外。他に選択肢がない場合は、前者が推奨されるアプローチです。

私の最善の選択肢は何ですか、または信頼性の高いサードパーティのライブラリは何ですか?

どうも

4

1 に答える 1

0

これが正確に必要なものかどうかはわかりませんが、 NPOI(Gemboxではない)を使用すると、保護されたブックを読み取って変更し、保存することができます。たとえば、このような方法でA1セルの値を読み取り、D4の値を変更して、結果を保存することができます。これは、ブックが保護されている場合でも機能します(Excelを使用してx.xlsを変更することはできません)。

        string fullPath = @"c:\tmp\x.xls";
        FileStream aFile = new FileStream(fullPath, FileMode.Open, FileAccess.Read);
        HSSFWorkbook wb = new HSSFWorkbook(aFile);
        aFile.Close();
        ISheet curSheet = wb.GetSheet("Foglio1");
        IRow aRow = curSheet.GetRow(0);
        if (aRow == null)
            aRow = curSheet.CreateRow(0);
        ICell aCell = aRow.GetCell(0);
        if (aCell == null)
            aCell = aRow.CreateCell(0);
        MessageBox.Show(aCell.StringCellValue);
        aRow = curSheet.GetRow(3);
        if (aRow == null)
            aRow = curSheet.CreateRow(3);
        aCell = aRow.GetCell(3);
        if (aCell == null)
            aCell = aRow.CreateCell(3);
        aCell.SetCellValue("testValue");
        fullPath = @"c:\tmp\x2.xls";
        File.Delete(fullPath);
        aFile = new FileStream(fullPath, FileMode.Create);
        wb.Write(aFile);
        aFile.Close();

残念ながら、NPOIを使用してシートの保護を解除する方法はありません(少なくとも私が知っている方法ではありません)が、元のパスワードを知らなくても、パスワードを好きなように設定できます。それは次のように簡単です:

curSheet.ProtectSheet(string.Empty);
于 2012-10-10T05:41:24.740 に答える