NPOIを使用したExcelファイル操作

NPOIは.NETプラットフォーム向けのPOI実装であり、Microsoft Officeがインストールされていない環境でもExcel、Word、PowerPointなどのファイルを読み書きできるライブラリです。

主要コンポーネント

  • NPOI.Util - 基本ユーティリティライブラリ
  • NPOI.POIFS - OLE2フォーマット読み書きライブラリ
  • NPOI.DDF - Microsoft Drawingフォーマット読み書きライブラリ
  • NPOI.SS - Excel数式計算ライブラリ
  • NPOI.HPSF - OLE2の要約情報プロパティ読み書きライブラリ
  • NPOI.HSSF - Excel BIFFフォーマット読み書きライブラリ

Excelブックの作成

NPOI.HSSF.UserModel.HSSFWorkbookクラスを使用してExcelドキュメントを作成します。

// 新しいExcelブックの作成
HSSFWorkbook workbook = new HSSFWorkbook();
// シートの追加(少なくとも1つのシートが必要)
workbook.CreateSheet("データシート");
// ファイルストリームの作成
using (FileStream output = new FileStream(@"C:\output\sample.xls", FileMode.Create))
{
    workbook.Write(output);
}

Excelからテキストファイルへのデータ変換

using NPOI.HSSF.UserModel;
using System.IO;
using NPOI.SS.UserModel;

public class ExcelToTextConverter
{
    public void ConvertExcelToText()
    {
        using (FileStream input = new FileStream(@"C:\data\source.xls", FileMode.Open))
        using (FileStream output = new FileStream(@"C:\data\output.txt", FileMode.Create))
        using (StreamWriter writer = new StreamWriter(output, Encoding.UTF8))
        {
            HSSFWorkbook workbook = new HSSFWorkbook(input);
            ISheet worksheet = workbook.GetSheet("Sheet1");
            
            for (int rowIndex = 0; rowIndex <= worksheet.LastRowNum; rowIndex++)
            {
                IRow row = worksheet.GetRow(rowIndex);
                if (row != null)
                {
                    for (int cellIndex = 0; cellIndex < row.LastCellNum; cellIndex++)
                    {
                        ICell cell = row.GetCell(cellIndex);
                        writer.Write(cell?.ToString() + "\t");
                    }
                    writer.WriteLine();
                }
            }
        }
    }
}

テキストファイルからExcelへのデータ変換

public class TextToExcelConverter
{
    public void ConvertTextToExcel()
    {
        using (FileStream input = new FileStream(@"C:\data\source.txt", FileMode.Open))
        using (StreamReader reader = new StreamReader(input, Encoding.UTF8))
        {
            HSSFWorkbook workbook = new HSSFWorkbook();
            ISheet worksheet = workbook.CreateSheet("インポートデータ");
            
            string currentLine;
            int rowNumber = 0;
            
            while ((currentLine = reader.ReadLine()) != null)
            {
                IRow row = worksheet.CreateRow(rowNumber);
                string[] values = currentLine.Split('\t');
                
                for (int i = 0; i < values.Length; i++)
                {
                    row.CreateCell(i).SetCellValue(values[i]);
                }
                rowNumber++;
            }
            
            using (FileStream output = new FileStream(@"C:\data\output.xls", FileMode.Create))
            {
                workbook.Write(output);
            }
        }
    }
}

表示設定のカスタマイズ

ズームレベルの設定

worksheet.SetZoom(3, 4);  // 75%表示

セルの保護

ICellStyle lockedStyle = workbook.CreateCellStyle();
lockedStyle.IsLocked = true;

ICell targetCell = worksheet.GetRow(0).GetCell(0);
targetCell.CellStyle = lockedStyle;

worksheet.ProtectSheet("password123");

行・列の固定

// 最初の3列と1行を固定
worksheet.CreateFreezePane(3, 1, 10, 10);

アクティブセルの設定

// 単一セルの選択
cell.SetAsActiveCell();

// セル範囲の選択
worksheet.SetActiveCellRange(1, 4, 0, 4);  // 2-5行、1-5列

複数範囲の選択

var ranges = new List<CellRangeAddress8Bit>()
{
    new CellRangeAddress8Bit(0, 2, 1, 4),
    new CellRangeAddress8Bit(5, 6, 7, 8)
};
worksheet.SetActiveCellRange(ranges, 1, 0, 2);

表示範囲の制限

worksheet.TopRow = 5;
worksheet.LeftCol = 3;

アクティブシートの設定

workbook.SetActiveSheet(0);  // 最初のシートをアクティブに

データ検証

var validationRange = new CellRangeAddressList(0, 9, 0, 0);
var dateConstraint = DVConstraint.CreateDateConstraint(
    OperatorType.BETWEEN, 
    "2024-01-01", 
    "2024-12-31", 
    "yyyy-MM-dd");

var validation = new HSSFDataValidation(validationRange, dateConstraint);
validation.CreateErrorBox("入力エラー", "有効な日付を入力してください");
worksheet.AddValidationData(validation);

行・列のグループ化

worksheet.GroupRow(0, 4);    // 1-5行をグループ化
worksheet.GroupColumn(0, 2); // 1-3列をグループ化

グリッドラインの表示制御

worksheet.DisplayGridlines = false;

タグ: NPOI Excel操作 .NET ファイル操作 データ変換

7月10日 18:29 投稿