c# 导包_C#导入导出EXCEL实例包括2003和2007以上版本

2019-01-14 修复 Excel空行出错

2018-10-27 修复 解决Excel超出DataTable列问题

2018-09-04 修复 导入时间格式问题

导入时间格式问题分析

之前整理的NPOI导入导出Excel 在之前使用过程中没发现问题。

但是后来发现导入的文档如果有日期时间格式,导入时会有混乱

后来找了一下解决方案,最终将其中一段修改即可导入日期(导出未测试) 原因

NPOI导入时会大概判断一下Excel文档里面的单元格是什么格式的内容,

有Blank,Boolean,Numeric,String,Error,Formula 等几种,

但是就是没有日期的,日期的单元格会被判断成Numeric(数字)类型,

所以日期格式的单元格就按数字类型来取其中的值,

所以单元格被判断成数字的之后还要再判断一下是否为日期格式。

如果C#基础不是很好的话,直接把我这个类拿过去用就可以了

C#导入导出EXCEL实例包括2003和2007以上版本

这个引用了NPOI,DLL文件   NPOI  DLL下面实例有下载

源码实例下载地址https://pan.baidu.com/s/1pLIEDwn

以下是核心源码

using NPOI.HSSF.UserModel;

using NPOI.SS.UserModel;

using NPOI.XSSF.UserModel;

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

namespace PEC.Common

{

///

/// 操作Excel通用类

///

public class ExcelHelper

{

///

/// 从Excel读取数据

/// 只支持单表

///

/// 文件路径

public static DataTable ReadFromExcel(string FilePath)

{

DataTable result = null;

IWorkbook wk = null;

string extension = System.IO.Path.GetExtension(FilePath); //获取扩展名

try

{

using (FileStream fs = File.OpenRead(FilePath))

{

if (extension.Equals(".xls")) //2003

{

wk = new HSSFWorkbook(fs);

}

else //2007以上

{

wk = new XSSFWorkbook(fs);

}

}

//读取当前表数据

ISheet sheet = wk.GetSheetAt(0);

//构建DataTable

IRow row = sheet.GetRow(0);

result = BuildDataTable(row);

if (result != null)

{

if (sheet.LastRowNum >= 1)

{

for (int i = 1; i < sheet.LastRowNum + 1; i++)

{

IRow temp_row = sheet.GetRow(i);

if (temp_row == null) { continue; }//2019-01-14 修复 行为空时会出错

List itemArray = new List();

for (int j = 0; j < result.Columns.Count; j++)//解决Excel超出DataTable列问题 lqwvje20181027

{

//itemArray.Add(temp_row.GetCell(j) == null ? string.Empty : temp_row.GetCell(j).ToString());

itemArray.Add(GetValueType(temp_row.GetCell(j)));//解决 导入Excel 时间格式问题 lqwvje 20180904

}

result.Rows.Add(itemArray.ToArray());

}

}

}

return result;

}

catch (Exception ex)

{

return null;

}

}

///

/// 将DataTable数据导入到excel中

///

/// 要导入的数据

/// DataTable的列名是否要导入

/// 要导入的excel的sheet的名称

/// 导入数据行数(包含列名那一行)

public static int DataTableToExcel(DataTable data, string sheetName, string fileName, bool isColumnWritten)

{

int i = 0;

int j = 0;

int count = 0;

ISheet sheet = null;

IWorkbook workbook = null;

using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))

{

if (fileName.IndexOf(".xlsx") > 0) // 2007版本

workbook = new XSSFWorkbook();

else if (fileName.IndexOf(".xls") > 0) // 2003版本

workbook = new HSSFWorkbook();

try

{

if (workbook != null)

{

sheet = workbook.CreateSheet(sheetName);

}

else

{

return -1;

}

if (isColumnWritten == true) //写入DataTable的列名

{

IRow row = sheet.CreateRow(0);

for (j = 0; j < data.Columns.Count; ++j)

{

row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);

}

count = 1;

}

else

{

count = 0;

}

for (i = 0; i < data.Rows.Count; ++i)

{

IRow row = sheet.CreateRow(count);

for (j = 0; j < data.Columns.Count; ++j)

{

row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());

}

++count;

}

workbook.Write(fs); //写入到excel

return count;

}

catch (Exception ex)

{

Console.WriteLine("Exception: " + ex.Message);

return -1;

}

}

}

private static DataTable BuildDataTable(IRow Row)

{

DataTable result = null;

if (Row.Cells.Count > 0)

{

result = new DataTable();

for (int i = 0; i < Row.LastCellNum; i++)

{

result.Columns.Add(Row.GetCell(i).ToString());

}

}

return result;

}

///

/// 获取单元格类型

///

///

///

private static object GetValueType(ICell cell)

{

if (cell == null)

return null;

switch (cell.CellType)

{

case CellType.Blank: //BLANK:

return null;

case CellType.Boolean: //BOOLEAN:

return cell.BooleanCellValue;

case CellType.Numeric: //NUMERIC:

short format = cell.CellStyle.DataFormat;

if (format != 0) { return Convert.ToDateTime(cell.DateCellValue).ToString("yyyy-MM-dd HH:mm:ss"); } else { return cell.NumericCellValue; }

case CellType.String: //STRING:

return cell.StringCellValue;

case CellType.Error: //ERROR:

return cell.ErrorCellValue;

case CellType.Formula: //FORMULA:

default:

return "=" + cell.CellFormula;

}

}

}

}

以下是调用上面导入导出的方法

private void button2_Click(object sender, EventArgs e)

{

string strSql = "select * from H3AV61MeterMainData";//导出到Excel的DataTable

DataSet ds = SQLiteHellper.ExecuteQuery(strSql);

if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)

{

FolderBrowserDialog folder = new FolderBrowserDialog();

if (folder.ShowDialog() == DialogResult.OK)

{

string ExportDir = folder.SelectedPath + "\\数据导出" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";

int i = DataTableToExcel(ds.Tables[0], "测试", ExportDir, true);

MessageBox.Show(i.ToString());

}

}

}

private void button3_Click(object sender, EventArgs e)

{

OpenFileDialog openFile = new OpenFileDialog();

if (openFile.ShowDialog() == DialogResult.OK)

{

string filePath = openFile.FileName;

DataTable excelDt = ReadFromExcel(filePath);

//把Excel读取到DataTable里面 然后再把DataTable存入数据库

}

}

你可能感兴趣的:(c#,导包)