更新
This commit is contained in:
266
NPOI.md
Normal file
266
NPOI.md
Normal file
@@ -0,0 +1,266 @@
|
||||
# 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user