using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace HotelPms.Share.Windows.Util
{
public class NPOIExcel : IDisposable
{
#region ★★★★★ Declartions ★★★★★
private bool m_Disposed = false;
private bool m_IsEditting = false;
#endregion
#region ★★★★★ Property ★★★★★
///
/// 絶対パス
///
public string FileName { get; set; } = string.Empty;
///
/// 現在のWorkbook
///
public IWorkbook Workbook { get; set; } = null;
///
/// 選択されたSheet
///
public ISheet Sheet { get; set; } = null;
///
/// Excel2003前?
///
public bool XlsMode { get; set; } = false;
#endregion
#region ★★★★★ Class Event ★★★★★
public NPOIExcel(string fileName)
{
FileName = fileName;
FileInfo fileInfo = new FileInfo(FileName);
XlsMode = (fileInfo.Extension == ".xls");
if (System.IO.File.Exists(FileName))
{
using (FileStream file = new FileStream(FileName, FileMode.Open, FileAccess.Read))
{
Workbook = XlsMode ? new HSSFWorkbook(file) : new XSSFWorkbook(file);
}
Sheet = Workbook.GetSheetAt(0);
Sheet.ForceFormulaRecalculation = true;
}
else
{
Workbook = XlsMode ? new HSSFWorkbook() : new XSSFWorkbook();
Sheet = Workbook.CreateSheet("Sheet1"); //シートの作成
}
}
~NPOIExcel()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (!m_Disposed) //一回だけ
{
if (disposing)
{
if (m_IsEditting) { Save(); }
//Managed Resources
}
//Unmanaged resources
m_Disposed = true;
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
#endregion
#region ★★★★★ Private Function ★★★★★
private string GetCellFormat(ICell cell)
{
IDataFormat df = XlsMode ? new HSSFDataFormat((Workbook as HSSFWorkbook).Workbook) : new XSSFDataFormat((Workbook as XSSFWorkbook).GetStylesSource());
return df.GetFormat(cell.CellStyle.DataFormat);
}
#endregion
#region ★★★★★ Public Function ★★★★★
///
/// シート変換
///
///
public void SetCurrentSheet(int sheetIdx)
{
Sheet = Workbook.GetSheetAt(sheetIdx);
Sheet.ForceFormulaRecalculation = true;
}
///
/// 存在しない時、null
///
///
///
public ICell? GetCell(string colRowValue)
{
return GetCell(colRowValue, false);
}
public object? GetCellValue(string colRowValue)
{
try
{
ICell cell = GetCell(colRowValue);
if (cell == null) { return string.Empty; }
System.Diagnostics.Debug.WriteLine($"{colRowValue}.CellType={cell.CellType}");
if (cell.CellType == CellType.Numeric) { return cell.NumericCellValue; }
else if (cell.CellType == CellType.Boolean) { return cell.BooleanCellValue; }
else { return cell.StringCellValue; }
}
catch
{
return string.Empty;
}
}
public string? GetCellForceString(string colRowValue)
{
try
{
object ret = GetCellValue(colRowValue);
return ret == null ? string.Empty : ret.ToString();
}
catch
{
return string.Empty;
}
}
///
/// セルの値を取得する
///
///
///
public string GetCellString(string colRowValue)
{
try
{
ICell cell = GetCell(colRowValue);
if (cell == null) { return string.Empty; }
System.Diagnostics.Debug.WriteLine($"{colRowValue}={cell.StringCellValue}");
return cell.StringCellValue;
}
catch
{
return string.Empty;
}
}
public int GetCellInt(string colRowValue)
{
try
{
ICell cell = GetCell(colRowValue);
if (cell == null) { return 0; }
return (int)cell.NumericCellValue;
}
catch
{
return 0;
}
}
///
/// 存在しない時、新規
///
///
///
public ICell? GetCell(string colRowValue, bool newCell)
{
System.Drawing.Point p = GetCellPoint(colRowValue);
IRow row = Sheet.GetRow(p.Y);
if (row == null)
{
if (newCell) { row = Sheet.CreateRow(p.Y); } else { return null; }
}
ICell cell = row.GetCell(p.X);
if (cell == null)
{
if (newCell) { cell = row.CreateCell(p.X); } else { return null; }
}
return cell;
}
///
/// フォントの作成
///
///
public IFont CreateFont()
{
IFont font = Workbook.CreateFont();
return font;
}
///
/// 計算式セット
///
///
///
public void SetCellFormula(string colRowValue, string formula)
{
m_IsEditting = true;
ICell cell = GetCell(colRowValue, true);
cell.SetCellFormula(formula);
}
///
/// セルの値セット:xls専用
///
///
///
public void SetCell(string colRowValue, HSSFRichTextString richTextString)
{
m_IsEditting = true;
ICell cell = GetCell(colRowValue, true);
cell.SetCellValue(richTextString);
}
///
/// セルの値セット:数字専用
///
///
///
public void SetCell(string colRowValue, double value)
{
m_IsEditting = true;
ICell cell = GetCell(colRowValue, true);
cell.SetCellValue(value);
}
///
/// セルの値セット:日付専用
///
///
///
public void SetCell(string colRowValue, DateTime value)
{
m_IsEditting = true;
ICell cell = GetCell(colRowValue, true);
cell.SetCellValue(value);
}
///
/// セルの値セット:Boolean
///
///
///
public void SetCell(string colRowValue, bool value)
{
m_IsEditting = true;
ICell cell = GetCell(colRowValue, true);
cell.SetCellValue(value);
}
///
/// 数字型変換対応
///
///
///
public void SetCell(string colRowValue, string value)
{
m_IsEditting = true;
System.Drawing.Point p = GetCellPoint(colRowValue);
IRow row = Sheet.GetRow(p.Y);
if (row == null) { row = Sheet.CreateRow(p.Y); }
ICell cell = row.GetCell(p.X);
if (cell == null) { cell = row.CreateCell(p.X); }
string format = GetCellFormat(cell);
if ((format.Contains("#") && format.Contains("0")) || format.Contains("0_"))
{
double val = 0;
if (double.TryParse(value, out val))
{
cell.SetCellValue(val);
}
else
{
cell.SetCellValue(value);
}
}
else
{
cell.SetCellValue(value);
}
}
///
/// 保存
///
public void Save()
{
//Write the stream data of workbook to the root directory
using (FileStream file = new FileStream(FileName, FileMode.Create))
{
Workbook.Write(file, true);
file.Close();
}
}
/// ExcelX位置→EXCEL列文字 (1→A,2→B,3→C,27→AA)
///
/// 索引号
/// string
public static string ToColName(int ColNum)
{
int ll_mod;
string ColName = "";
while (ColNum > 0)
{
ll_mod = ColNum % 26;
if (ll_mod == 0)
{
ColName = "Z" + ColName;
ll_mod = 1;
}
else
{
ColName = (Convert.ToChar(ll_mod + 64)).ToString() + ColName;
}
ColNum = (ColNum - ll_mod) / 26;
}
return ColName;
}
/// Excel列文字→ExcelX位置 ("A"→1、"AA"→27)
///
/// 列名
/// int
public static int ToIndex(string ColName)
{
int ColIndex = 0;
for (int i = ColName.Length - 1; i >= 0; i--)
{
ColIndex += Convert.ToInt32(((int)ColName[i] - 64) * Math.Pow(26, (ColName.Length - 1) - i));
}
return ColIndex;
}
/// Excel文字→Excel位置("A1"→(0,0)、"B2"→(1,1))(0基準)
///
///
///
public static System.Drawing.Point GetCellPoint(string colRowValue)
{
System.Drawing.Point point = new System.Drawing.Point(0, 0);
string colstr = string.Empty;
string rowStr = string.Empty;
for (int i = 0; i < colRowValue.Length; i++)
{
if (Char.IsNumber(colRowValue[i]))
{
rowStr += colRowValue[i].ToString();
}
else
{
colstr += colRowValue[i].ToString();
}
}
point.Y = Convert.ToInt32(rowStr) - 1; //行
point.X = ToIndex(colstr) - 1;
return point;
}
#endregion
}
}