C# で Excel を操作するには、データベースを通じて Excel を読み書きする OleDb メソッドなど、さまざまな方法がありますが、OleDb メソッドには Microsoft Office のインストールが必要です。また、COM コンポーネントを通じて Excel を操作することもできます。COM コンポーネントにも Microsoft のインストールが必要です。エクセル。Microsoft Office パッケージをインストールしたくない場合は、ClosedXML、EPPlus、NPOI を使用できます。この記事ではNPOIでよく使われる手法を中心に紹介します。
Apache POI は、Apache Software Foundation のオープン ソース ライブラリであり、Java プログラムが Microsoft Office 形式のファイルを読み書きするための API を提供します。
NuGet インストール NPOI
NPO は SixLabors.Fonts のベータ版に依存しているため、最初に SixLabors.Fonts をインストールする必要があります。
次に、NPOI をインストールします。
メインオブジェクト
物体 | オブジェクトの説明 |
---|---|
HSSFワークブック | Excel ドキュメント オブジェクト workbook.xls ファイル |
XSSFワークブック | Excel ドキュメント オブジェクト ワークブック .xlsx ファイル |
HSSFシート | Excelのシートワークシート |
HSSFRow | エクセルの行 |
HSSF名 | 名前 |
HSSFDateFormat | 日付形式 |
HSSFヘッダー | シートヘッダー |
HSSFFooter | sheet尾 |
HSSFCellStyle | セルスタイル |
HSSFDateUtil | 日付 |
HSSF印刷セットアップ | 印刷する |
HSSFエラー定数 | エラーメッセージテーブル |
HSSF は Horrible SpreadSheet Format の略称であり、HSSF を介して、純粋な Java コードを使用して Microsoft Excel BIFF (Excel 97-2003、xls) ファイルの読み取り、書き込み、および変更を行うことができます。HSSF は、読み取り操作用に と の 2 種類の API 、usermodel
つまりeventusermodel
「ユーザー モデル」と「ユーザー イベント モデル」を提供します。
Excel の読み取りと書き込み
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WorkbookFactoryDemo
{
class Program
{
static void Main(string[] args)
{
using (var stream= File.OpenRead("test.xlsx"))
{
IWorkbook workbook = WorkbookFactory.Create(stream);
//workbook.GetSheetAt(0).CopySheet("Folha1");
/*for (int i = 0; i < workbook.NumberOfSheets; i++)
{
ISheet sheet = workbook.GetSheetAt(i);
Console.WriteLine(sheet.SheetName);
}*/
using (FileStream fileWriter = new FileStream("TestOutput.xlsx", FileMode.Create, FileAccess.ReadWrite, FileShare.None))
{
workbook.Write(fileWriter, false);
}
Console.ReadLine();
}
}
}
}
Excel のすべてのセルを反復処理する
using System;
using NPOI.SS.UserModel;
namespace ReadAndPrintData
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
using (var workbook = WorkbookFactory.Create("data.xlsx"))
{
ISheet sheet = workbook.GetSheetAt(0);
foreach (IRow row in sheet)
{
for (var i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
if (cell != null)
{
Console.Write(cell.ToString());
Console.Write("\t");
}
}
Console.WriteLine();
}
}
Console.Read();
}
}
}
ファイルのプロパティを設定する
using NPOI;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.IO;
namespace CreateCustomProperties
{
class Program
{
static void Main(string[] args)
{
XSSFWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
POIXMLProperties props = workbook.GetProperties();
props.CoreProperties.Creator = "NPOI 2.5.1";
props.CoreProperties.Created = DateTime.Now;
if (!props.CustomProperties.Contains("NPOI Team"))
props.CustomProperties.AddProperty("NPOI Team", "Hello World!");
FileStream sw = File.Create("test.xlsx");
workbook.Write(sw);
sw.Close();
}
}
}
セル値を設定: SetCellValue
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace NPOI.Examples.XSSF.SetCellValuesInXlsx
{
class Program
{
static void Main(string[] args)
{
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
sheet1.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");
int x = 1;
for (int i = 1; i <= 15; i++)
{
IRow row = sheet1.CreateRow(i);
for (int j = 0; j < 15; j++)
{
row.CreateCell(j).SetCellValue(x++);
}
}
FileStream sw = File.Create("test.xlsx");
workbook.Write(sw);
sw.Close();
}
}
}
記入日
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using (IWorkbook workbook = new XSSFWorkbook())
{
ISheet sheet = workbook.CreateSheet("Sheet1");
//increase the width of Column A
sheet.SetColumnWidth(0, 5000);
//create the format instance
IDataFormat format = workbook.CreateDataFormat();
//Chinese date string
ICell cell7 = sheet.CreateRow(6).CreateCell(0);
SetValueAndFormat(workbook, cell7, new DateOnly(2004, 5, 6), format.GetFormat("yyyy年m月d日"));
using (FileStream sw = File.Create("test.xlsx"))
{
workbook.Write(sw, false);
}
}
static void SetValueAndFormat(IWorkbook workbook, ICell cell, DateOnly value, short formatId)
{
//set value for the cell
cell.SetCellValue(value);
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.DataFormat = formatId;
cell.CellStyle = cellStyle;
}
背景色を設定する
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace NPOI.Examples.XSSF.FillBackgroundInXlsx
{
class Program
{
static void Main(string[] args)
{
using (IWorkbook workbook = new XSSFWorkbook())
{
ISheet sheet1 = workbook.CreateSheet("Sheet1");
//fill background
ICellStyle style1 = workbook.CreateCellStyle();
style1.FillForegroundColor = IndexedColors.Blue.Index;
style1.FillPattern = FillPattern.BigSpots;
style1.FillBackgroundColor = IndexedColors.Pink.Index;
sheet1.CreateRow(0).CreateCell(0).CellStyle = style1;
//fill background
ICellStyle style2 = workbook.CreateCellStyle();
style2.FillForegroundColor = IndexedColors.Yellow.Index;
style2.FillPattern = FillPattern.AltBars;
style2.FillBackgroundColor = IndexedColors.Rose.Index;
sheet1.CreateRow(1).CreateCell(0).CellStyle = style2;
//fill background
ICellStyle style3 = workbook.CreateCellStyle();
style3.FillForegroundColor = IndexedColors.Lime.Index;
style3.FillPattern = FillPattern.LessDots;
style3.FillBackgroundColor = IndexedColors.LightGreen.Index;
sheet1.CreateRow(2).CreateCell(0).CellStyle = style3;
//fill background
ICellStyle style4 = workbook.CreateCellStyle();
style4.FillForegroundColor = IndexedColors.Yellow.Index;
style4.FillPattern = FillPattern.LeastDots;
style4.FillBackgroundColor = IndexedColors.Rose.Index;
sheet1.CreateRow(3).CreateCell(0).CellStyle = style4;
//fill background
ICellStyle style5 = workbook.CreateCellStyle();
style5.FillForegroundColor = IndexedColors.LightBlue.Index;
style5.FillPattern = FillPattern.Bricks;
style5.FillBackgroundColor = IndexedColors.Plum.Index;
sheet1.CreateRow(4).CreateCell(0).CellStyle = style5;
//fill background
ICellStyle style6 = workbook.CreateCellStyle();
style6.FillForegroundColor = IndexedColors.SeaGreen.Index;
style6.FillPattern = FillPattern.FineDots;
style6.FillBackgroundColor = IndexedColors.White.Index;
sheet1.CreateRow(5).CreateCell(0).CellStyle = style6;
//fill background
ICellStyle style7 = workbook.CreateCellStyle();
style7.FillForegroundColor = IndexedColors.Orange.Index;
style7.FillPattern = FillPattern.Diamonds;
style7.FillBackgroundColor = IndexedColors.Orchid.Index;
sheet1.CreateRow(6).CreateCell(0).CellStyle = style7;
//fill background
ICellStyle style8 = workbook.CreateCellStyle();
style8.FillForegroundColor = IndexedColors.White.Index;
style8.FillPattern = FillPattern.Squares;
style8.FillBackgroundColor = IndexedColors.Red.Index;
sheet1.CreateRow(7).CreateCell(0).CellStyle = style8;
//fill background
ICellStyle style9 = workbook.CreateCellStyle();
style9.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style9.FillPattern = FillPattern.SparseDots;
style9.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(8).CreateCell(0).CellStyle = style9;
//fill background
ICellStyle style10 = workbook.CreateCellStyle();
style10.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style10.FillPattern = FillPattern.ThinBackwardDiagonals;
style10.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(9).CreateCell(0).CellStyle = style10;
//fill background
ICellStyle style11 = workbook.CreateCellStyle();
style11.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style11.FillPattern = FillPattern.ThickForwardDiagonals;
style11.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(10).CreateCell(0).CellStyle = style11;
//fill background
ICellStyle style12 = workbook.CreateCellStyle();
style12.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style12.FillPattern = FillPattern.ThickHorizontalBands;
style12.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(11).CreateCell(0).CellStyle = style12;
//fill background
ICellStyle style13 = workbook.CreateCellStyle();
style13.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style13.FillPattern = FillPattern.ThickVerticalBands;
style13.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(12).CreateCell(0).CellStyle = style13;
//fill background
ICellStyle style14 = workbook.CreateCellStyle();
style14.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style14.FillPattern = FillPattern.ThickBackwardDiagonals;
style14.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(13).CreateCell(0).CellStyle = style14;
//fill background
ICellStyle style15 = workbook.CreateCellStyle();
style15.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style15.FillPattern = FillPattern.ThinForwardDiagonals;
style15.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(14).CreateCell(0).CellStyle = style15;
//fill background
ICellStyle style16 = workbook.CreateCellStyle();
style16.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style16.FillPattern = FillPattern.ThinHorizontalBands;
style16.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(15).CreateCell(0).CellStyle = style16;
//fill background
ICellStyle style17 = workbook.CreateCellStyle();
style17.FillForegroundColor = IndexedColors.RoyalBlue.Index;
style17.FillPattern = FillPattern.ThinVerticalBands;
style17.FillBackgroundColor = IndexedColors.Yellow.Index;
sheet1.CreateRow(16).CreateCell(0).CellStyle = style17;
//fill background with gradient color, this only works with NPOI 2.6.0
XSSFCellStyle style18 = (XSSFCellStyle)workbook.CreateCellStyle();
style18.FillPattern = FillPattern.SolidForeground;
var fillidx = (int)style18.GetCoreXf().fillId;
var ctfill = ((XSSFWorkbook)workbook).GetStylesSource().GetFillAt(fillidx).GetCTFill();
ctfill.UnsetPatternFill();
byte[] rgb1 = new byte[3];
rgb1[0] = (byte)0; // red
rgb1[1] = (byte)0; // green
rgb1[2] = (byte)255; // blue
byte[] rgb2 = new byte[3];
rgb2[0] = (byte)255; // red
rgb2[1] = (byte)255; // green
rgb2[2] = (byte)255; // blue
ctfill.gradientFill = new OpenXmlFormats.Spreadsheet.CT_GradientFill();
var ctgradientfill = ctfill.gradientFill;
ctgradientfill.degree = 90;
ctgradientfill.AddNewStop().position = 0;
ctgradientfill.GetStopArray(0).AddNewColor().SetRgb(rgb1);
ctgradientfill.AddNewStop().position = 0.5;
ctgradientfill.GetStopArray(1).AddNewColor().SetRgb(rgb2);
ctgradientfill.AddNewStop().position = 1.0;
ctgradientfill.GetStopArray(2).AddNewColor().SetRgb(rgb1);
sheet1.CreateRow(16).CreateCell(0).CellStyle = style18;
using (FileStream sw = File.Create("test.xlsx"))
{
workbook.Write(sw, false);
}
}
}
}
}
幅と高さを設定する
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace NPOI.Examples.XSSF.SetWidthAndHeightInXlsx
{
class Program
{
static void Main(string[] args)
{
using (IWorkbook workbook = new XSSFWorkbook())
{
ISheet sheet1 = workbook.CreateSheet("Sheet1");
//set the width of columns
sheet1.SetColumnWidth(0, 50 * 256);
sheet1.SetColumnWidth(1, 100 * 256);
sheet1.SetColumnWidth(2, 150 * 256);
//set the width of height
sheet1.CreateRow(0).Height = 100 * 20;
sheet1.CreateRow(1).Height = 200 * 20;
sheet1.CreateRow(2).Height = 300 * 20;
using (FileStream sw = File.Create("test.xlsx"))
{
workbook.Write(sw, false);
}
}
}
}
}
折れ線グラフ
using NPOI.SS.UserModel;
using NPOI.SS.UserModel.Charts;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System.IO;
namespace LineChart
{
class Program
{
const int NUM_OF_ROWS = 3;
const int NUM_OF_COLUMNS = 10;
static void CreateChart(IDrawing drawing, ISheet sheet, IClientAnchor anchor, string serie1, string serie2, bool enableMajorGridline=false)
{
XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
chart.SetTitle("Test 1");
IChartLegend legend = chart.GetOrCreateLegend();
legend.Position = LegendPosition.TopRight;
ILineChartData<double, double> data = chart.ChartDataFactory.CreateLineChartData<double, double>();
// Use a category axis for the bottom axis.
IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
leftAxis.Crosses = AxisCrosses.AutoZero;
IChartDataSource<double> xs = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(0, 0, 0, NUM_OF_COLUMNS - 1));
IChartDataSource<double> ys1 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, NUM_OF_COLUMNS - 1));
IChartDataSource<double> ys2 = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(2, 2, 0, NUM_OF_COLUMNS - 1));
var s1 = data.AddSeries(xs, ys1);
s1.SetTitle(serie1);
var s2 = data.AddSeries(xs, ys2);
s2.SetTitle(serie2);
chart.Plot(data, bottomAxis, leftAxis);
//add major gridline, available since NPOI 2.5.5
var plotArea = chart.GetCTChart().plotArea;
plotArea.catAx[0].AddNewMajorGridlines();
plotArea.valAx[0].AddNewMajorGridlines();
}
static void Main(string[] args)
{
using (IWorkbook wb = new XSSFWorkbook())
{
ISheet sheet = wb.CreateSheet("linechart");
// Create a row and put some cells in it. Rows are 0 based.
IRow row;
ICell cell;
for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++)
{
row = sheet.CreateRow((short)rowIndex);
for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++)
{
cell = row.CreateCell((short)colIndex);
cell.SetCellValue(colIndex * (rowIndex + 1));
}
}
IDrawing drawing = sheet.CreateDrawingPatriarch();
IClientAnchor anchor1 = drawing.CreateAnchor(0, 0, 0, 0, 0, 5, 10, 15);
CreateChart(drawing, sheet, anchor1, "title1", "title2");
IClientAnchor anchor2 = drawing.CreateAnchor(0, 0, 0, 0, 0, 20, 10, 35);
CreateChart(drawing, sheet, anchor2, "s1", "s2", true);
using (FileStream fs = File.Create("test.xlsx"))
{
wb.Write(fs, false);
}
}
}
}
}
棒グラフ
using NPOI.SS.UserModel;
using NPOI.SS.UserModel.Charts;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System;
using System.IO;
namespace BarChart
{
class Program
{
const int NUM_OF_ROWS = 10;
const int NUM_OF_COLUMNS = 2;
private static void CreateChart(ISheet sheet, IDrawing drawing, IClientAnchor anchor, string serieTitle, int startDataRow, int endDataRow, int columnIndex)
{
XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
IBarChartData<string, double> barChartData = chart.ChartDataFactory.CreateBarChartData<string, double>();
IChartLegend legend = chart.GetOrCreateLegend();
legend.Position = LegendPosition.Bottom;
IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
bottomAxis.MajorTickMark = AxisTickMark.None;
IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
leftAxis.Crosses = AxisCrosses.AutoZero;
leftAxis.SetCrossBetween(AxisCrossBetween.Between);
IChartDataSource<string> categoryAxis = DataSources.FromStringCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, 0, 0));
IChartDataSource<double> valueAxis = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, columnIndex, columnIndex));
var serie = barChartData.AddSeries(categoryAxis, valueAxis);
serie.SetTitle(serieTitle);
chart.Plot(barChartData, bottomAxis, leftAxis);
}
static void Main(string[] args)
{
using (IWorkbook wb = new XSSFWorkbook())
{
ISheet sheet = wb.CreateSheet();
// Create a row and put some cells in it. Rows are 0 based.
IRow row;
ICell cell;
for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++)
{
row = sheet.CreateRow((short)rowIndex);
for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++)
{
cell = row.CreateCell((short)colIndex);
if (colIndex == 0)
cell.SetCellValue("X" + rowIndex);
else
{
var x = colIndex * (rowIndex + 1);
cell.SetCellValue(x * x + 2 * x + 1);
}
}
}
XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, 3, 3, 10, 12);
CreateChart(sheet, drawing, anchor, "s1", 0, 9, 1);
using (FileStream fs = File.Create("test.xlsx"))
{
wb.Write(fs, false);
}
}
}
}
}
印刷範囲を設定する
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.IO;
namespace SetPrintArea
{
class Program
{
static IWorkbook workbook;
static void Main(string[] args)
{
InitializeWorkbook(args);
ISheet sheet = workbook.CreateSheet("Timesheet");
sheet.CreateRow(0).CreateCell(0).SetCellValue("Test");
workbook.SetPrintArea(0, "$A$1:$C$5");
//workbook.SetPrintArea(0, "$A$1:$C$5,$E$9:$I$16"); not working in xls
WriteToFile();
}
static void WriteToFile()
{
string filename = "timesheet.xls";
if (workbook is XSSFWorkbook) filename += "x";
//Write the stream data of workbook to the root directory
using (FileStream file = new FileStream(filename, FileMode.Create))
{
workbook.Write(file);
}
}
static void InitializeWorkbook(string[] args)
{
if (args.Length > 0 && args[0].Equals("-xls"))
workbook = new HSSFWorkbook();
else
workbook = new XSSFWorkbook();
}
}
}
参考
https://github.com/nissl-lab/npoi
https://github.com/nissl-lab/npoi-examples
https://blog.csdn.net/weixin_44899642/article/details/124687499