自已摸索实现了对excel简单的上传和下载并做了一个封装类,下面分享一下。

先去官网:http://npoi.codeplex.com/下载需要引入dll(可以选择.net2.0或者.net4.0的dll),然后在网站中添加引用。

1、定义tools工具类:工具类封装了对excel的上传和下载功能

 public class Tools
{
#region 打开保存excel对话框返回文件名
public static string SaveExcelFileDialog()
{
var sfd = new Microsoft.Win32.SaveFileDialog()
{
DefaultExt = "xls",
Filter = "excel files(*.xls)|*.xls|All files(*.*)|*.*",
FilterIndex =
}; if (sfd.ShowDialog() != true)
return null;
return sfd.FileName;
}
#endregion
#region 打开excel对话框返回文件名
public static string OpenExcelFileDialog()
{
var ofd = new Microsoft.Win32.OpenFileDialog()
{
DefaultExt = "xls",
Filter = "excel files(*.xls)|*.xls|All files(*.*)|*.*",
FilterIndex =
}; if (ofd.ShowDialog() != true)
return null;
return ofd.FileName;
}
#endregion
#region 读excel
public static DataTable ImportExcelFile()
{
DataTable dt = new DataTable(); //打开excel对话框
var filepath = OpenExcelFileDialog();
if (filepath != null)
{ HSSFWorkbook hssfworkbook = null;
#region//初始化信息
try
{
using (FileStream file = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
}
catch (Exception e)
{
throw e;
}
#endregion var sheet = hssfworkbook.GetSheetAt();
System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); for (int j = ; j < (sheet.GetRow().LastCellNum); j++)
{
dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());
}
while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = ; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i);
if (cell == null)
{
dr[i] = "";
}
else
{
if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
                            {
                                if (HSSFDateUtil.IsCellDateFormatted(cell))
                                {
                                    dr[i] = cell.DateCellValue;
                                }
                                else
                                {
                                    dr[i] = cell.NumericCellValue;
                                }
                            }
                            else if (cell.CellType == NPOI.SS.UserModel.CellType.Boolean)
                            {
                                dr[i] = cell.BooleanCellValue;
                            }
                            else
                            {
                                dr[i] = cell.StringCellValue;
                            }
}
}
dt.Rows.Add(dr);
}
}
return dt;
}
#endregion #region list转datatable
public static DataTable ListToDataTable<T>(IEnumerable<T> c)
{
var props = typeof(T).GetProperties();
var dt = new DataTable();
dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray());
if (c.Count() > )
{
for (int i = ; i < c.Count(); i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo item in props)
{
object obj = item.GetValue(c.ElementAt(i), null);
tempList.Add(obj);
}
dt.LoadDataRow(tempList.ToArray(), true);
}
}
return dt;
}
#endregion
#region 写入excel
public static bool WriteExcel<T>(IList<T> list)
{ //打开保存excel对话框
var filepath = SaveExcelFileDialog();
if (filepath == null)
return false; var dt = ListToDataTable<T>(list); if (!string.IsNullOrEmpty(filepath) && null != dt && dt.Rows.Count > )
{
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet1"); NPOI.SS.UserModel.IRow row = sheet.CreateRow();
for (int i = ; i < dt.Columns.Count; i++)
{
row.CreateCell(i).SetCellValue(dt.Columns[i].ColumnName);
}
for (int i = ; i < dt.Rows.Count; i++)
{
NPOI.SS.UserModel.IRow row2 = sheet.CreateRow(i + );
for (int j = ; j < dt.Columns.Count; j++)
{
row2.CreateCell(j).SetCellValue(Convert.ToString(dt.Rows[i][j]));
}
}
// 写入到客户端
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
book.Write(ms);
using (FileStream fs = new FileStream(filepath, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, , data.Length);
fs.Flush();
}
book = null;
}
}
return true;
}
#endregion
}

2、上传导入:list是集合,User是一个Model类

        private void Button_Click(object sender, RoutedEventArgs e)
{ //读取数据至datatable
var dt =Tools.ImportExcelFile();
if (dt == null) return; //根据实际model转换成集合,规则:第一行一般是标题行,数据一般都是从第二行开始,所有从i=1开始读取
for (int i = ; i < dt.Rows.Count; i++)
{
var row = dt.Rows[i];
list.Add(new User
{
name = row[].ToString(),
pwd = row[].ToString()
});
}
}

3、下载保存: list是一个集合,保存list中的数据到excel表中。

 //读取数据至datatable
var IsOk = Tools.WriteExcel(list);
if (IsOk)
{
MessageBox.Show("保存成功");
}

使用非常方便吧。

WPF通过NPIO读写Excel操作的更多相关文章

  1. pandas 读写excel 操作(按索引和关键字读取行和列,写入csv文件)

    pandas读写excel和csv操作总结 按索引读取某一列的值 按关键字读取某一列的值 按关键字查询某一行的值 保存成字典并写入新的csv import pandas as pd grades=pd ...

  2. node读写Excel操作

    目支持写Excel的node.js模块: node-xlsx: 基于Node.js解析excel文件数据及生成excel文件: excel-parser: 基于Node.js解析excel文件数据,支 ...

  3. C# WPF 利用NPOI读写Excel文件

    https://blog.csdn.net/a312024054/article/details/70139172 [各种样式] https://www.cnblogs.com/xwgli/archi ...

  4. 基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  5. 网页中NPIO对Excel的操作实例

    上一节是在wpf中实现对excel的操作方法,这一节看看网页中如何封装实现对excel的上传导入和下载保存的. 看看效果图:

  6. 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...

  7. java对excel文件内容读写修改操作

    Read.java package domain; import java.io.FileInputStream; import java.io.InputStream; import jxl.Cel ...

  8. Perl读写Excel简单操作

    Perl读写Excel简单操作 使用模块 Spreadsheet::ParseExcel Spreadsheet::WriteExcel 读Excel #!/usr/bin/perl -w use s ...

  9. python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作

    一.匿名函数 递归:就是调用自己 def func(): num = int(input('num:')) if num % 2 ==0: print('是偶数') return else: func ...

随机推荐

  1. 实验1 查看CPU和内存,用机器指令和汇编指令编程

    ·实验任务 (1)使用Debug,用E命令和A命令以两种方式将指令写入内存 机器码        汇编指令 b8 20 4e    mov ax,4e20h 05 16 14    add ax,14 ...

  2. 封装axios方法之一

    一.先来说说为什么要封装axios异步请求. 我们前端开发中总是会遇到跨域的问题,我们会配置proxy来解决跨域的问题,无论是vue 还是react. 如何配置我这里就不说了. 然后...然后我们就会 ...

  3. [Real World Haskell翻译]第21章 使用数据库

    第21章 使用数据库 从网络论坛到播客采集软件甚至备份程序的一切频繁地使用持久存储的数据库.基于SQL的数据库往往是相当方便:速度快,可扩展从微小到巨大的尺寸,可以在网络上运行,经常帮助处理锁定和事务 ...

  4. 20145234黄斐《信息安全系统设计基础》第八周(Linux下vim相关命令)

    Linux下vim相关命令 在编辑程序时经常使用vim,所以记住一些常用的指令还是很有必要的 文件命令 vim file 打开单个文件vim file vim file1 file2 file3 .. ...

  5. 将 List<Obj> 集合, 导出至 Excel

    主代码在这:http://www.codeproject.com/Articles/120480/Export-to-Excel-Functionality-in-WPF-DataGrid 黑人老外写 ...

  6. c++动态库封装及调用(2、windows下动态库创建)

    DLL即动态链接库(Dynamic-Link Libaray)的缩写,相当于Linux下的共享对象.Windows系统中大量采用了DLL机制,甚至内核的结构很大程度依赖与DLL机制.Windows下的 ...

  7. rn打包分析

    rn打包原来是packager,后来独立出一个专门的打包工具metro,构建工具的大体思路跟前端构建工具差不多,都会有一个启动文件,然后根据模块依赖关系把对应文件找到. 开发中打包 在开发中打包,我们 ...

  8. 汽车后市场:数据入口在哪里?不看你就OUT啦!

    当前中国汽车后服务市场基本可分七个大类:包括养护.维修.改装.二手车.汽车配件.相关电商及金融保险等,汽车后市场整个产业链对数据服务都有刚性需求. 数据能为行业服务提高效率,提升商家对于客户以及业务的 ...

  9. Qt-QML-QML调用C++类

    QML用来做界面,在不考虑数据的请款下,那是溜溜的,但是,程序是没有不和后台数据交互的,但是了,QML在数据处理方面的效率又是不敢恭维的,这里就出现了QML负责前端界面,而后端使用JS或者C++了. ...

  10. Java 输出对象为字符串 工具类

    public static String reflectionToString(Object o){ if(o == null) return StringUtils.EMPTY; StringBui ...