There are many ways to operate Excel in C#, such as the OleDb method to read and write Excel through the database, but the OleDb method needs to install Microsoft Office, and you can also operate Excel through the COM component, which also needs to install Microsoft Excel. If you don't want to install Microsoft Office package, you can use ClosedXML, EPPlus, NPOI. This article mainly introduces the commonly used methods of NPOI.
Apache POI is an open source library of the Apache Software Foundation. POI provides an API for Java programs to read and write files in Microsoft Office format.
NuGet install NPOI
NPO relies on the beta version of SixLabors.Fonts, and SixLabors.Fonts needs to be installed first.
Then install NPOI:
main object
object | object description |
---|---|
HSSFWorkbook | excel document object workbook.xls file |
XSSFWorkbook | excel document object workbook .xlsx file |
HSSFSheet | Excel's sheet worksheet |
HSSFRow | row of excel |
HSSFName | name |
HSSFDateFomat | date format |
HSSFHeader | sheet header |
HSSFFooter | sheet tail |
HSSFCellStyle | cell style |
HSSFDateUtil | date |
HSSFPrintSetup | |
HSSFErrorConstants | error message table |
HSSF is the abbreviation of Horrible SpreadSheet Format. Through HSSF, you can use pure Java code to read, write, and modify Microsoft Excel BIFF (Excel 97-2003, xls) files. HSSF provides two types of APIs for read operations: usermodel
and eventusermodel
, namely "user model" and "user event model".
Read and write 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();
}
}
}
}
Iterate over all cells in 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();
}
}
}
Set file properties
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();
}
}
}
Set cell value: 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();
}
}
}
fill date
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;
}
set background color
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);
}
}
}
}
}
set width and height
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);
}
}
}
}
}
line chart
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);
}
}
}
}
}
bar chart
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);
}
}
}
}
}
Set print range
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();
}
}
}
reference
https://github.com/nissl-lab/npoi
https://github.com/nissl-lab/npoi-examples
https://blog.csdn.net/weixin_44899642/article/details/124687499