267 lines
10 KiB
Markdown
267 lines
10 KiB
Markdown
# NPOI
|
||
|
||
```csharp
|
||
internal class NPOIUtil
|
||
{
|
||
/// <summary>
|
||
/// DataTable导出到Excel文件
|
||
/// </summary>
|
||
/// <param name="dtSource">源DataTable</param>
|
||
/// <param name="strHeaderText">表头文本</param>
|
||
/// <param name="strFileName">保存位置</param>
|
||
public static void Export(DataTable dtSource, string strHeaderText, string strFileName)
|
||
{
|
||
using (MemoryStream ms = Export(dtSource, strHeaderText))
|
||
{
|
||
using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
|
||
{
|
||
byte[] data = ms.ToArray();
|
||
fs.Write(data, 0, data.Length);
|
||
fs.Flush();
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// DataTable导出到Excel的MemoryStream
|
||
/// </summary>
|
||
/// <param name="dtSource">源DataTable</param>
|
||
/// <param name="strHeaderText">表头文本</param>
|
||
/// <returns>The <see cref="MemoryStream"/></returns>
|
||
public static MemoryStream Export(DataTable dtSource, string strHeaderText)
|
||
{
|
||
HSSFWorkbook workbook = new HSSFWorkbook();
|
||
ISheet sheet = workbook.CreateSheet();
|
||
|
||
ICellStyle dateStyle = workbook.CreateCellStyle();
|
||
IDataFormat format = workbook.CreateDataFormat();
|
||
dateStyle.DataFormat = format.GetFormat("yyyy-MM-dd");
|
||
|
||
int[] arrColWidth = new int[dtSource.Columns.Count];
|
||
foreach (DataColumn item in dtSource.Columns)
|
||
{
|
||
//GBK对应的code page是CP936
|
||
arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
|
||
}
|
||
for (int i = 0; i < dtSource.Rows.Count; i++)
|
||
{
|
||
for (int j = 0; j < dtSource.Columns.Count; j++)
|
||
{
|
||
int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
|
||
if (intTemp > arrColWidth[j])
|
||
{
|
||
arrColWidth[j] = intTemp;
|
||
}
|
||
}
|
||
}
|
||
|
||
int rowIndex = 0;
|
||
|
||
foreach (DataRow row in dtSource.Rows)
|
||
{
|
||
if (rowIndex == 65535 || rowIndex == 0)
|
||
{
|
||
if (rowIndex != 0)
|
||
{
|
||
sheet = workbook.CreateSheet();
|
||
}
|
||
|
||
{
|
||
IRow headerRow = sheet.CreateRow(0);
|
||
headerRow.HeightInPoints = 25;
|
||
headerRow.CreateCell(0).SetCellValue(strHeaderText);
|
||
|
||
ICellStyle headStyle = workbook.CreateCellStyle();
|
||
headStyle.Alignment = HorizontalAlignment.Center;
|
||
IFont font = workbook.CreateFont();
|
||
font.FontHeightInPoints = 20;
|
||
font.IsBold = true;
|
||
headStyle.SetFont(font);
|
||
|
||
headerRow.GetCell(0).CellStyle = headStyle;
|
||
|
||
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
|
||
}
|
||
|
||
{
|
||
IRow headerRow = sheet.CreateRow(1);
|
||
ICellStyle headStyle = workbook.CreateCellStyle();
|
||
headStyle.Alignment = HorizontalAlignment.Center;
|
||
IFont font = workbook.CreateFont();
|
||
font.FontHeightInPoints = 10;
|
||
font.IsBold = true;
|
||
headStyle.SetFont(font);
|
||
|
||
foreach (DataColumn column in dtSource.Columns)
|
||
{
|
||
headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
|
||
headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
|
||
|
||
//设置列宽
|
||
sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
|
||
}
|
||
}
|
||
|
||
rowIndex = 2;
|
||
}
|
||
|
||
ICellStyle contentStyle = workbook.CreateCellStyle();
|
||
contentStyle.Alignment = HorizontalAlignment.Left;
|
||
IRow dataRow = sheet.CreateRow(rowIndex);
|
||
foreach (DataColumn column in dtSource.Columns)
|
||
{
|
||
ICell newCell = dataRow.CreateCell(column.Ordinal);
|
||
newCell.CellStyle = contentStyle;
|
||
|
||
string drValue = row[column].ToString();
|
||
|
||
switch (column.DataType.ToString())
|
||
{
|
||
case "System.String"://字符串类型
|
||
newCell.SetCellValue(drValue);
|
||
break;
|
||
|
||
case "System.DateTime"://日期类型
|
||
DateTime dateV;
|
||
DateTime.TryParse(drValue, out dateV);
|
||
newCell.SetCellValue(dateV);
|
||
|
||
newCell.CellStyle = dateStyle;//格式化显示
|
||
break;
|
||
|
||
case "System.Boolean"://布尔型
|
||
bool boolV = false;
|
||
bool.TryParse(drValue, out boolV);
|
||
newCell.SetCellValue(boolV);
|
||
break;
|
||
|
||
case "System.Int16"://整型
|
||
case "System.Int32":
|
||
case "System.Int64":
|
||
case "System.Byte":
|
||
int intV = 0;
|
||
int.TryParse(drValue, out intV);
|
||
newCell.SetCellValue(intV);
|
||
break;
|
||
|
||
case "System.Decimal"://浮点型
|
||
case "System.Double":
|
||
double doubV = 0;
|
||
double.TryParse(drValue, out doubV);
|
||
newCell.SetCellValue(doubV);
|
||
break;
|
||
|
||
case "System.DBNull"://空值处理
|
||
newCell.SetCellValue("");
|
||
break;
|
||
|
||
default:
|
||
newCell.SetCellValue("");
|
||
break;
|
||
}
|
||
}
|
||
|
||
rowIndex++;
|
||
}
|
||
|
||
using (MemoryStream ms = new MemoryStream())
|
||
{
|
||
workbook.Write(ms);
|
||
ms.Flush();
|
||
ms.Position = 0;
|
||
|
||
//sheet.Dispose();
|
||
//workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
|
||
return ms;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 默认第一行为标头
|
||
/// </summary>
|
||
/// <param name="strFileName">excel文档路径</param>
|
||
/// <returns></returns>
|
||
public static DataTable Import(string strFileName)
|
||
{
|
||
DataTable dt = new DataTable();
|
||
|
||
HSSFWorkbook hssfworkbook;
|
||
using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
|
||
{
|
||
hssfworkbook = new HSSFWorkbook(file);
|
||
}
|
||
ISheet sheet = hssfworkbook.GetSheetAt(0);
|
||
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
||
|
||
IRow headerRow = sheet.GetRow(0);
|
||
int cellCount = headerRow.LastCellNum;
|
||
|
||
for (int j = 0; j < cellCount; j++)
|
||
{
|
||
ICell cell = headerRow.GetCell(j);
|
||
dt.Columns.Add(cell.ToString());
|
||
}
|
||
|
||
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
|
||
{
|
||
IRow row = sheet.GetRow(i);
|
||
DataRow dataRow = dt.NewRow();
|
||
|
||
for (int j = row.FirstCellNum; j < cellCount; j++)
|
||
{
|
||
if (row.GetCell(j) != null)
|
||
dataRow[j] = row.GetCell(j).ToString();
|
||
}
|
||
|
||
dt.Rows.Add(dataRow);
|
||
}
|
||
return dt;
|
||
}
|
||
|
||
/// <summary>
|
||
///TableToExcel
|
||
/// </summary>
|
||
/// <param name="dt">The dt<see cref="DataTable"/></param>
|
||
/// <param name="file">The file<see cref="string"/></param>
|
||
private static void TableToExcel(DataTable dt, string file)
|
||
{
|
||
IWorkbook workbook;
|
||
string fileExt = Path.GetExtension(file).ToLower();
|
||
if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; }
|
||
if (workbook == null) { return; }
|
||
ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("项目基点信息") : workbook.CreateSheet(dt.TableName);
|
||
|
||
//表头
|
||
IRow row = sheet.CreateRow(0);
|
||
for (int i = 0; i < dt.Columns.Count; i++)
|
||
{
|
||
ICell cell = row.CreateCell(i);
|
||
cell.SetCellValue(dt.Columns[i].ColumnName);
|
||
}
|
||
|
||
//数据
|
||
for (int i = 0; i < dt.Rows.Count; i++)
|
||
{
|
||
IRow row1 = sheet.CreateRow(i + 1);
|
||
for (int j = 0; j < dt.Columns.Count; j++)
|
||
{
|
||
ICell cell = row1.CreateCell(j);
|
||
cell.SetCellValue(dt.Rows[i][j].ToString());
|
||
}
|
||
}
|
||
|
||
//转为字节数组
|
||
MemoryStream stream = new MemoryStream();
|
||
workbook.Write(stream);
|
||
var buf = stream.ToArray();
|
||
|
||
//保存为Excel文件
|
||
using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
|
||
{
|
||
fs.Write(buf, 0, buf.Length);
|
||
fs.Flush();
|
||
}
|
||
}
|
||
}
|
||
```
|