/// <summary>
/// 将excel中的数据导入到DataSet中
/// </summary>
public DataSet ExcelToDataSet(string fileName)
{
IWorkbook workbook = null;
try
{
if (fileName.Contains(Extension07))
{
// 2007版本
workbook = new XSSFWorkbook(fileName);
}
else if (fileName.Contains(Extension03))
{
// 2003版本
using (var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
workbook = new HSSFWorkbook(fs);
}
}
else
{
return null;
}
return WorkbookToDataSet(workbook);
}
finally
{
workbook?.Close();
}
}
/// <summary>
/// Workbook转DataSet
/// </summary>
private static DataSet WorkbookToDataSet(IWorkbook workbook)
{
var ds = new DataSet();
for (var i = 0; i < workbook.NumberOfSheets; i++)
{
var sheet = workbook.GetSheetAt(i);
var dt = SheetToDataTable(sheet);
if (dt != null)
{
ds.Tables.Add(dt);
}
}
return ds.Tables.Count == 0 ? null : ds;
}
/// <summary>
/// SHEET转DataTable
/// </summary>
private static DataTable SheetToDataTable(ISheet sheet)
{
if (sheet == null || sheet.LastRowNum == 0) return null;
using (var upb = new UProgressBar($"{ULanguage.Load}{ULanguage.Data},\"{sheet.SheetName}\"", sheet.LastRowNum))
{
var firstRow = sheet.GetRow(0);
if (firstRow == null) return null;
var data = new DataTable(sheet.SheetName);
//设置表头
for (int i = firstRow.FirstCellNum; i < firstRow.LastCellNum; ++i)
{
var cell = firstRow.GetCell(i);
var v = GetCellValue(cell);
if (!string.IsNullOrEmpty(v))
{
data.Columns.Add(v);
}
}
//设置值
for (var i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; ++i)
{
var row = sheet.GetRow(i);
if (row == null || row.Cells.Count == 0)
{
continue;
}
var isNull = true;
var dataRow = data.NewRow();
//for (int j = row.FirstCellNum; j < firstRow.LastCellNum; ++j)
for (int j = row.FirstCellNum; j < data.Columns.Count; ++j)
{
object v = GetCellValue(row.GetCell(j));
if (v != null && v.ToString() != string.Empty)
{
//检测是否为空行
isNull = false;
}
dataRow[j] = v;
}
if (!isNull)
{
data.Rows.Add(dataRow);
}
upb.Add();
}
return data;
}
}
/// <summary>
/// 获取单元格的值
/// </summary>
private static string GetCellValue(ICell cell)
{
if (cell == null)
{
return null;
}
switch (cell.CellType)
{
//空数据类型处理
case CellType.Blank:
return string.Empty;
//字符串类型
case CellType.String:
return Filter(cell.StringCellValue);
//数字或日期类型
case CellType.Numeric:
return GetNumericOrDate(cell);
//公式类型
case CellType.Formula:
try
{
return Filter(cell.StringCellValue);
}
catch
{
return GetNumericOrDate(cell);
}
case CellType.Unknown:
return "Unknown";
case CellType.Boolean:
return cell.BooleanCellValue ? bool.TrueString : bool.FalseString;
case CellType.Error:
return "Error";
default:
return string.Empty;
}
}
/// <summary>
/// 过滤前后空格和分行符
/// </summary>
private static string Filter(string s)
{
return s.Replace("\r", string.Empty).Replace("\n", string.Empty).Trim();
}
/// <summary>
/// 获取单元格Numeric或Date的值
/// </summary>
private static string GetNumericOrDate(ICell cell)
{
return DateUtil.IsCellDateFormatted(cell)
? cell.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss")
: cell.NumericCellValue.ToString(CultureInfo.InvariantCulture);
}