- ติดตั้ง Package
- สร้างไฟล์ .xlsx เปล่า
- ใส่ข้อความลงฟิลด์
- ใส่สไตล์ให้ฟิลด์
- อ่านไฟล์ .xlsx
- ป้องกันการแก้ไข sheet ด้วย Password
ทดสอบบน .NET Framework 4.5
1. ติดตั้ง Package
ติดตั้ง NPOI 2.5.1
PM> Install-Package NPOI -Version 2.5.1
ติดตั้ง Newtonsoft.Json 12.0.3
PM> Install-Package Newtonsoft.Json -Version 12.0.3
2. สร้างไฟล์ .xlsx เปล่า
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string filename = @"d:\Result.xlsx";
WriteExcel(filename);
}
static void WriteExcel(string filename)
{
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
ISheet sheet2 = workbook.CreateSheet("Sheet2");
workbook.Write(fs);
}
}
} // end class
}
3. ใส่ข้อความลงฟิลด์
using Newtonsoft.Json;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace ConsoleApp1
{
class UserDetails
{
public string ID { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
class Program
{
static void Main(string[] args)
{
string filename = @"d:\Result.xlsx";
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="1001", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="1002", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="1003", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="1004", Name="LMNO", City ="City4", Country="UK"},
};
// Lets converts our object data to Datatable for a simplified logic.
// Datatable is most easy way to deal with complex datatypes for easy reading and formatting.
DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
WriteExcel(filename, table);
}
static void WriteExcel(string filename, DataTable table)
{
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
IWorkbook workbook = new XSSFWorkbook();
ISheet excelSheet = workbook.CreateSheet("Sheet1");
List<String> columns = new List<string>();
IRow row = excelSheet.CreateRow(0);
int columnIndex = 0;
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
row.CreateCell(columnIndex).SetCellValue(column.ColumnName);
columnIndex++;
}
int rowIndex = 1;
foreach (DataRow dsrow in table.Rows)
{
row = excelSheet.CreateRow(rowIndex);
int cellIndex = 0;
foreach (String col in columns)
{
row.CreateCell(cellIndex).SetCellValue(dsrow[col].ToString());
cellIndex++;
}
rowIndex++;
}
workbook.Write(fs);
}
}
} // end class
}

ถ้าจะใช้ชื่อคอลัมน์เป็นภาษาไทย ให้ปั้นข้อมูลเป็น DataTable
static void Main(string[] args)
{
string filename = @"d:\Result.xlsx";
DataTable table = new DataTable();
table.Columns.Add("ไอดี");
table.Columns.Add("ชื่อ");
table.Columns.Add("เมือง");
table.Columns.Add("ประเทศ");
DataRow dr = table.NewRow();
dr["ไอดี"] = "1001";
dr["ชื่อ"] = "ABCD";
dr["เมือง"] = "City1";
dr["ประเทศ"] = "USA";
table.Rows.Add(dr);
WriteExcel(filename, table);
}

4. ใส่สไตล์ให้ฟิลด์
using Newtonsoft.Json;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
namespace ConsoleApp1
{
class UserDetails
{
public string ID { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
class Program
{
static void Main(string[] args)
{
string filename = @"d:\Result.xlsx";
List<UserDetails> persons = new List<UserDetails>()
{
new UserDetails() {ID="1001", Name="ABCD", City ="City1", Country="USA"},
new UserDetails() {ID="1002", Name="PQRS", City ="City2", Country="INDIA"},
new UserDetails() {ID="1003", Name="XYZZ", City ="City3", Country="CHINA"},
new UserDetails() {ID="1004", Name="LMNO", City ="City4", Country="UK"},
};
// Lets converts our object data to Datatable for a simplified logic.
// Datatable is most easy way to deal with complex datatypes for easy reading and formatting.
DataTable table = (DataTable)JsonConvert.DeserializeObject(JsonConvert.SerializeObject(persons), (typeof(DataTable)));
WriteExcel(filename, table);
}
static void WriteExcel(string filename, DataTable table)
{
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
IWorkbook workbook = new XSSFWorkbook();
ISheet excelSheet = workbook.CreateSheet("Sheet1");
List<String> columns = new List<string>();
IRow row = excelSheet.CreateRow(0);
// Create the style object
var customStyle = workbook.CreateCellStyle();
// Define a thin border for the top and bottom of the cell
customStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
customStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
// Create a font object and make it bold
var customFont = workbook.CreateFont();
customFont.IsBold = true;
customStyle.SetFont(customFont);
int columnIndex = 0;
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
var cell = row.CreateCell(columnIndex);
cell.SetCellValue(column.ColumnName);
cell.CellStyle = customStyle;
columnIndex++;
}
int rowIndex = 1;
foreach (DataRow dsrow in table.Rows)
{
row = excelSheet.CreateRow(rowIndex);
int cellIndex = 0;
foreach (String col in columns)
{
row.CreateCell(cellIndex).SetCellValue(dsrow[col].ToString());
cellIndex++;
}
rowIndex++;
}
workbook.Write(fs);
}
}
} // end class
}

ใส่สีให้กับ cell
... customStyle.FillForegroundColor = IndexedColors.LightGreen.Index; customStyle.FillPattern = FillPattern.SolidForeground; ...

Merge cell
... int rowNum = 1; var cra = new NPOI.SS.Util.CellRangeAddress(rowNum, rowNum, 2, 3); excelSheet.AddMergedRegion(cra); workbook.Write(fs);

Alignment
... customStyle.Alignment = HorizontalAlignment.Center; ...

5. อ่านไฟล์ .xlsx
using Newtonsoft.Json;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
namespace ConsoleApp1
{
class UserDetails
{
public string ID { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
class Program
{
static void Main(string[] args)
{
string filename = @"d:\Result.xlsx";
string json = ReadExcel(filename);
List<UserDetails> persons = JsonConvert.DeserializeObject<List<UserDetails>>(json);
}
static string ReadExcel(string filename)
{
DataTable dtTable = new DataTable();
List<string> rowList = new List<string>();
ISheet sheet;
using (var stream = new FileStream(filename, FileMode.Open))
{
stream.Position = 0;
XSSFWorkbook xssWorkbook = new XSSFWorkbook(stream);
sheet = xssWorkbook.GetSheetAt(0);
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
if (cell == null || string.IsNullOrWhiteSpace(cell.ToString())) continue;
{
dtTable.Columns.Add(cell.ToString());
}
}
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row == null) continue;
if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
if (!string.IsNullOrEmpty(row.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(row.GetCell(j).ToString()))
{
rowList.Add(row.GetCell(j).ToString());
}
}
}
if (rowList.Count > 0)
dtTable.Rows.Add(rowList.ToArray());
rowList.Clear();
}
}
return JsonConvert.SerializeObject(dtTable);
}
} // end class
}
6.ป้องกันการแก้ไข sheet ด้วย Password
ที่ sheet1 จะเปิดดูได้ แต่จะแก้ไขไม่ได้ ส่วน sheet2 แก้ไขได้ปกติ
ถ้าจะแก้ไข sheet1 ให้ไปที่เมนู Review | Unprotect Sheet แล้วใส่ password
static void WriteExcel(string filename)
{
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet1 = workbook.CreateSheet("Sheet1");
ISheet sheet2 = workbook.CreateSheet("Sheet2");
bool x = sheet1.Protect; // false
sheet1.ProtectSheet("Password");
bool y = sheet1.Protect; // ture
workbook.Write(fs);
}
}