一、Excel理论知识

最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq

• 整个Excel表格叫做工作簿:WorkBook

• 工作簿由以下几部分组成

  a.页(Sheet);

  b.行(Row);

  c.单元格(Cell);

二、处理Excel的技术

•OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来运行Excel的操作。

  优点:强大,Excel能实现的功能,都可以实现

  缺点:必须装Excel

•把Excel当成数据库,使用Microsoft.Jet.OleDb访问Excel,只适合二维结构,功能少,不用装Excel

•OpenXML,微软提供的读写Excel的技术,只能处理xlsx格式文件

•NPOI、MyXls,能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性和性能的问题。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx用OpenXML

  1. 描述工作簿的类:IWorkbook(接口)、HSSFWorkbook(具体实现类)
  2.  
  3. 描述工作表的类:ISheet(接口)、HSSFSheet(具体实现类)

三、NPOI导出

方式一(默认导出位置)

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. List<Person> list = new List<Person>() {
  4. new Person(){Name="张三",Age="15",Email="123@qq.com" },
  5. new Person(){Name="李四",Age="16",Email="456@qq.com" },
  6. new Person(){Name="王五",Age="17",Email="789@qq.com" }
  7. };
  8. // 引用命名空间
  9. // using NPOI.HSSF.UserModel;
  10. // using NPOI.SS.UserModel;
  11. // using System.IO;
  12. //将List集合中的内容导出到Excel中
  13. //1、创建工作簿对象
  14. IWorkbook wkBook = new HSSFWorkbook();
  15. //2、在该工作簿中创建工作表对象
  16. ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
  17. //2.1向工作表中插入行与单元格
  18. for (int i = 0; i < list.Count; i++)
  19. {
  20. //在Sheet中插入创建一行
  21. IRow row = sheet.CreateRow(i);
  22. //在该行中创建单元格
  23. //方式一
  24. //ICell cell = row.CreateCell(0);
  25. //cell.SetCellValue(list[i].Name);
  26. //方式二
  27. row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
  28. row.CreateCell(1).SetCellValue(list[i].Age);
  29. row.CreateCell(2).SetCellValue(list[i].Email);
  30. }
  31. //3、写入,把内存中的workBook对象写入到磁盘上
  32. FileStream fsWrite = File.OpenWrite("Person.xls"); //导出时Excel的文件名
  33. wkBook.Write(fsWrite);
  34. MessageBox.Show("写入成功!", "提示");
  35. fsWrite.Close(); //关闭文件流
  36. wkBook.Close(); //关闭工作簿
  37. fsWrite.Dispose(); //释放文件流
  38. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace _01NPOI的写入
  8. {
  9. public class Person
  10. {
  11. public string Name { get; set; }
  12. public string Age { get; set; }
  13. public string Email { get; set; }
  14. }
  15. }

Person类

方式二(更友好的一种方式,用户可以指定导出位置)推荐

  1. private void button3_Click(object sender, EventArgs e)
  2. {
  3. List<Person> list = new List<Person>() {
  4. new Person(){Name="张三",Age="",Email="123@qq.com" },
  5. new Person(){Name="李四",Age="",Email="456@qq.com" },
  6. new Person(){Name="王五",Age="",Email="789@qq.com" }
  7. };
  8. //创建文件
  9. string fileName = "人员信息表";
  10. string saveFilePath = ""; //导出时文件的路径
  11. SaveFileDialog saveDialog = new SaveFileDialog();
  12. saveDialog.DefaultExt = "xls"; //默认文件扩展名
  13. saveDialog.Filter = "Excel文件|*.xls"; //文件名筛选字符串
  14. saveDialog.FileName = fileName; //导出文件名称
  15. saveDialog.ShowDialog(); //显示窗口
  16. saveFilePath = saveDialog.FileName; //文件路径
  17. // 引用命名空间
  18. // using NPOI.HSSF.UserModel;
  19. // using NPOI.SS.UserModel;
  20. // using System.IO;
  21. //将List集合中的内容导出到Excel中
  22. //1、创建工作簿对象
  23. IWorkbook wkBook = new HSSFWorkbook();
  24. //2、在该工作簿中创建工作表对象
  25. ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
  26. //2.1向工作表中插入行与单元格
  27. for (int i = ; i < list.Count; i++)
  28. {
  29. //在Sheet中插入创建一行
  30. IRow row = sheet.CreateRow(i);
  31. //在该行中创建单元格
  32. //方式一
  33. //ICell cell = row.CreateCell(0);
  34. //cell.SetCellValue(list[i].Name);
  35. //方式二
  36. row.CreateCell().SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
  37. row.CreateCell().SetCellValue(list[i].Age);
  38. row.CreateCell().SetCellValue(list[i].Email);
  39. }
  40. //3、写入,把内存中的workBook对象写入到磁盘上
  41. FileStream fsWrite = new FileStream(saveFilePath,FileMode.Create);
  42. wkBook.Write(fsWrite);
  43. MessageBox.Show("写入成功!", "提示");
  44. fsWrite.Close(); //关闭文件流
  45. wkBook.Close(); //关闭工作簿
  46. fsWrite.Dispose(); //释放文件流
  47. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace _01NPOI的写入
  8. {
  9. public class Person
  10. {
  11. public string Name { get; set; }
  12. public string Age { get; set; }
  13. public string Email { get; set; }
  14. }
  15. }

Person类

方式三、导出dataGridView数据

  1. public static void ExportExcel(string fileName, DataGridView dgv)
  2. {
  3. string saveFileName = "";
  4. SaveFileDialog saveDialog = new SaveFileDialog();
  5. saveDialog.DefaultExt = "xls";
  6. saveDialog.Filter = "Excel文件|*.xls";
  7. saveDialog.FileName = fileName;
  8. saveDialog.ShowDialog();
  9. saveFileName = saveDialog.FileName;
  10.  
  11. HSSFWorkbook workbook = new HSSFWorkbook();
  12. MemoryStream ms = new MemoryStream();
  13.  
  14. NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1");
  15.  
  16. int rowCount = dgv.Rows.Count+;
  17. int colCount = dgv.Columns.Count;
  18. int r1;
  19. NPOI.SS.UserModel.IRow dataRow1 = sheet.CreateRow();
  20.  
  21. for (int i = ; i < rowCount; i++)
  22. {
  23. NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);
  24. for (int j = ; j < colCount; j++)
  25. {
  26. if (i == )
  27. {
  28. r1 = i;
  29. }
  30. else
  31. {
  32. r1 = i - ;
  33. }
  34. if (dgv.Columns[j].Visible && dgv.Rows[r1].Cells[j].Value != null)
  35. {
  36. NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-);
  37. if (i == )
  38. {
  39. cell.SetCellValue(dgv.Columns[j].HeaderCell.Value.ToString());
  40. continue;
  41. }
  42. cell.SetCellValue(dgv.Rows[r1].Cells[j].FormattedValue.ToString());
  43. }
  44. else
  45. {
  46. NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-);
  47. cell.SetCellValue("");
  48. }
  49. }
  50. }
  51.  
  52. workbook.Write(ms);
  53. FileStream file = new FileStream(saveFileName, FileMode.Create);
  54. workbook.Write(file);
  55. file.Close();
  56. workbook = null;
  57. ms.Close();
  58. ms.Dispose();
  59. }

DGV中数据导出Excel

四、NPOI读取Excel内容

  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. //需要读取的文件:人员表.xls
  4. // 创建文件
  5. OpenFileDialog ofd = new OpenFileDialog();
  6. ofd.Filter = "Excel文件|*.xls";
  7. ofd.ShowDialog();
  8. string filePath = ofd.FileName;
  9. FileStream fsRead=null;
  10. IWorkbook wkBook = null;
  11. if (filePath != "")
  12. {
  13. //1、创建一个工作簿workBook对象
  14. fsRead = new FileStream(filePath, FileMode.Open);
  15. //将人员表.xls中的内容读取到fsRead中
  16. wkBook = new HSSFWorkbook(fsRead);
  17. //2、遍历wkBook中的每个工作表Sheet
  18. for (int i = ; i < wkBook.NumberOfSheets; i++)
  19. {
  20. //获取每个工作表对象
  21. ISheet sheet = wkBook.GetSheetAt(i);
  22. //获取每个工作表的行
  23. //foreach遍历 sheet.GetEnumerator
  24. for (int r = ; r < sheet.LastRowNum; r++)
  25. {
  26. //获取工作表中的每一行
  27. IRow currentRow = sheet.GetRow(r);
  28. //遍历当前行中的每个单元格
  29. for (int c = ; c < currentRow.LastCellNum; c++)
  30. {
  31. try
  32. {
  33. //获取每个单元格
  34. ICell cell = currentRow.GetCell(c);
  35. if (cell == null) //如果单元格为空时,程序会报错,这里判断提示用户,用try catch防止程序蹦
  36. {
  37. MessageBox.Show(string.Format("第{0}行,第{1}列单元格为空!",r,c));
  38. }
  39. CellType cType = cell.CellType; // 获取单元格中的类型
  40. MessageBox.Show(cType.ToString());
  41. //判断当前单元格的数据类型,可以拓展
  42. switch (cType)
  43. {
  44. case CellType.Numeric: //数字
  45. MessageBox.Show("我是数字");
  46. break;
  47. case CellType.String: //字符串
  48. MessageBox.Show("我是字符串");
  49. break;
  50. case CellType.Boolean:
  51. MessageBox.Show("我是布尔值");
  52. break;
  53. }
  54. //获取单元格的值
  55. //日期
  56. DateTime date = cell.DateCellValue;
  57. //数字
  58. double num = cell.NumericCellValue;
  59. //字符串
  60. string str = cell.StringCellValue;
  61. //布尔值
  62. bool bl = cell.BooleanCellValue;
  63. }
  64. catch (Exception EX)
  65. {
  66.  
  67. }
  68.  
  69. }
  70. }
  71. }
  72. }
  73. else
  74. {
  75. MessageBox.Show("选择文件失败!","提示");
  76. }
  77. fsRead.Close();
  78. wkBook.Close();
  79. fsRead.Dispose();
  80.  
  81. }

五、数据库中数据,导出Excel

  1. private void button4_Click(object sender, EventArgs e)
  2. {
  3. // 需引用命名空间
  4. // using System.Data.SqlClient;
  5. // using NPOI.HSSF.UserModel;
  6. // using NPOI.SS.UserModel;
  7. // using System.IO;
  8. //1、通过ado.net读取数据
  9. string strSql = "SELECT * FROM Students";
  10. SqlDataReader reader = sqlHelper.ExecuteReader(strSql,CommandType.Text);
  11. if (reader.HasRows) //若有数据
  12. {
  13. //2、将读取到的数据写入到Excel中
  14. //2.1创建工作簿WorkBook对象
  15. IWorkbook wkBook = new HSSFWorkbook();
  16. //2.2创建工作表
  17. ISheet sheet = wkBook.CreateSheet("人员信息表"); //工作表名称
  18. int rIndex = ;
  19. while (reader.Read())
  20. {
  21. //每读取一条数据,就创建一行row
  22. IRow currentRow = sheet.CreateRow(rIndex);
  23. rIndex++;
  24. int ID = reader.GetInt32();
  25. string name = reader.GetString();
  26. int age = reader.GetInt32();
  27. //向行中创建单元格
  28. currentRow.CreateCell().SetCellValue(ID); //第一个参数:单元格索引;第二个参数:给单元格赋值
  29. currentRow.CreateCell().SetCellValue(name);
  30. currentRow.CreateCell().SetCellValue(age);
  31. }
  32. //创建文件
  33. string fileName = "人员信息表";
  34. string saveFilePath = ""; //导出时文件的路径
  35. SaveFileDialog saveDialog = new SaveFileDialog();
  36. saveDialog.DefaultExt = "xls"; //默认文件扩展名
  37. saveDialog.Filter = "Excel文件|*.xls"; //文件名筛选字符串
  38. saveDialog.FileName = fileName; //导出文件名称
  39. saveDialog.ShowDialog(); //显示窗口
  40. saveFilePath = saveDialog.FileName; //文件路径
  41. //将workBook对象写入到磁盘上
  42. FileStream fsWrite = new FileStream(saveFilePath, FileMode.Create);
  43. wkBook.Write(fsWrite);
  44. MessageBox.Show("数据导出成功!", "提示");
  45. fsWrite.Close(); //关闭文件流
  46. wkBook.Close(); //关闭工作簿
  47. fsWrite.Dispose(); //释放文件流
  48. }
  49. else
  50. {
  51. MessageBox.Show("没有数据");
  52. }
  53.  
  54. //reader.Close();
  55. }
  1. public static SqlDataReader ExecuteReader(string strSql, CommandType cmdType, params SqlParameter[] pms)
  2. {
  3. SqlDataReader sr = null;
  4. SqlConnection conn = new SqlConnection(conStr);
  5. SqlCommand cmd = new SqlCommand(strSql, conn);
  6. cmd.CommandType = cmdType;
  7. if (pms != null)
  8. {
  9. cmd.Parameters.AddRange(pms);
  10. }
  11. try
  12. {
  13. if (conn.State == ConnectionState.Closed)
  14. {
  15. conn.Open();
  16. }
  17. sr = cmd.ExecuteReader();
  18. return sr;
  19. }
  20. catch (Exception EX)
  21. {
  22. MessageBox.Show(EX.Message.ToString());
  23. }
  24. finally
  25. {
  26. cmd.Dispose();
  27. }
  28. return sr;
  29. }

函数

六、Excel数据导入数据库

数据库字段

Excel数据(必须和数据库字段对上)

  1. Thread th; //声明公共变量
  2. private void button5_Click(object sender, EventArgs e)
  3. {
  4. //因为要遍历Excel中的数据,我们这里用线程执行
  5. // 需引入命名空间
  6. //using System.Threading;
  7. //using System.Data.SqlClient;
  8. //using NPOI.HSSF.UserModel;
  9. //using NPOI.SS.UserModel;
  10. //using System.IO;
  11. //创建文件
  12. object filePath = ""; // 文件路径
  13. OpenFileDialog ofd = new OpenFileDialog(); //创建文件
  14. ofd.Filter = "Excel文件|*.xls";
  15. ofd.ShowDialog();
  16. filePath = ofd.FileName;
  17. th = new Thread(inportData);
  18. th.IsBackground = true; //将线程设置为后台进程
  19. th.Start(filePath);
  20. ofd.Dispose();
  21. }
  22. private void inportData(object filePath)
  23. {
  24. // 创建表副本 SELECT TOP 0 * INSERT INTO newTable FROM oldTable
  25. //1、从Excel中读取数据
  26. if (filePath.ToString() != "")
  27. {
  28. FileStream fsRead = new FileStream(filePath.ToString(), FileMode.Open);
  29. //一、创建工作簿
  30. IWorkbook workBook = new HSSFWorkbook(fsRead);
  31. string insert_sql = "";
  32. string insert_module = "INSERT INTO Student2 (id,name,age) VALUES ({0})";
  33. StringBuilder sb = new StringBuilder();
  34. for (int i = ; i < workBook.NumberOfSheets; i++)
  35. {
  36. //获取工作表
  37. ISheet sheet = workBook.GetSheetAt(i);
  38. for (int r = ; r <= sheet.LastRowNum; r++) //遍历当前工作表中的所有行
  39. {
  40. IRow currentRow = sheet.GetRow(r); //获取每一行
  41. for (int c = ; c < currentRow.LastCellNum; c++) //遍历当前行中的所有列
  42. {
  43. //获取每个单元格
  44. ICell cell = currentRow.GetCell(c);
  45. //listCells.Add(cell);
  46. sb.Append("'").Append(cell.ToString()).Append("',");
  47. }
  48. //拼接SQL语句
  49. insert_sql += string.Format(insert_module, sb.ToString().Substring(, sb.ToString().Length - )) + ";";
  50. sb.Clear();
  51. //listCells.Clear();
  52. }
  53. }
  54. //2、把读取到的数据插入到数据库
  55. //执行SQL语句
  56. int ret = sqlHelper.ExecuteNonQuery(insert_sql, CommandType.Text);
  57. if (ret == )
  58. {
  59. MessageBox.Show("导入成功!");
  60. }
  61. else
  62. {
  63. MessageBox.Show("导入失败!");
  64. }
  65. fsRead.Close();
  66. fsRead.Dispose();
  67. }
  68. else
  69. {
  70. MessageBox.Show("文件打开失败!");
  71. }
  72. }
  1. /// <summary>
  2. /// 执行SQL语句
  3. /// </summary>
  4. /// <param name="strSql">sql语句</param>
  5. /// <param name="cmdType">CommandType.Text代表执行的SQL语句、CommandType.StoreProcedure代表执行的是存储过程</param>
  6. /// <param name="pms">可变参数数组</param>
  7. /// <returns></returns>
  8. public static int ExecuteNonQuery(string strSql, CommandType cmdType, params SqlParameter[] pms)
  9. {
  10. SqlConnection conn = new SqlConnection(conStr);
  11. SqlCommand cmd = new SqlCommand(strSql, conn);
  12. cmd.CommandType = cmdType;
  13. if (pms != null)
  14. {
  15. cmd.Parameters.AddRange(pms);
  16. }
  17. conn.Open();
  18. SqlTransaction trans = conn.BeginTransaction();
  19. try
  20. {
  21. cmd.Transaction = trans;
  22. int count = cmd.ExecuteNonQuery();
  23. if (count > )
  24. {
  25. trans.Commit(); //提交事务
  26. return ;
  27. }
  28. else
  29. {
  30. trans.Rollback(); //回滚事务
  31. return -;
  32. }
  33. }
  34. catch (Exception EX)
  35. {
  36. trans.Rollback(); //回滚事务
  37. MessageBox.Show(EX.Message.ToString());
  38. return -;
  39. }
  40. finally
  41. {
  42. conn.Close();
  43. conn.Dispose();
  44. cmd.Dispose();
  45. }
  46. }

函数

导入成功!!!

七、设置单元样式

  1. ICellStyle style = workbook.CreateCellStyle();//创建样式对象
  2. IFont font = workbook.CreateFont(); //创建一个字体样式对象
  3. font.FontName = "方正舒体"; //和excel里面的字体对应
  4. font.Color = new HSSFColor.PINK().GetIndex();//颜色参考NPOI的颜色对照表(替换掉PINK())
  5. font.IsItalic = true; //斜体
  6. font.FontHeightInPoints = ;//字体大小
  7. font.Boldweight = short.MaxValue;//字体加粗
  8. style.SetFont(font); //将字体样式赋给样式对象
  9. cell.CellStyle = style; //把样式赋给单元格

字体

  1. ICellStyle style=workbook.CreateCellStyle();
  2. style.FillForegroundColor = ; //具体数字代表的颜色看NPOI颜色对照表
  3. style.FillPattern = FillPatternType.SOLID_FOREGROUND;

单元格前景色

  1. 行高:row.Height = * ; //行高为30
  2.  
  3. 列宽:sheet.SetColumnWidth(, * ) //第4列的列宽为13

单元格宽高

  1. 单元格合并后,样式以左上角的单元格为准
  2.  
  3. //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
  4.  
  5. sheet.AddMergedRegion(new CellRangeAddress(, , , ));

合并单元格

  1. style.Alignment = HorizontalAlignment.CENTER;

水平居中

  1. 不需要写“=”号
  2.  
  3. cell.CellFormula = "公式";

设置公式

  1. //上下左右
  2.  
  3. styleFont.BorderTop = NPOI.SS.UserModel.BorderStyle.THIN;
  4. styleFont.BorderBottom = NPOI.SS.UserModel.BorderStyle.THIN;
  5. styleFont.BorderLeft = NPOI.SS.UserModel.BorderStyle.THIN;
  6. styleFont.BorderRight = NPOI.SS.UserModel.BorderStyle.THICK;

边框

-----------------------以下异常处理-----------------------

一、数据库中数据类型不同、为空时处理

数据库数据

导出处理

  1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. //1、通过ADO.NET读取数据
  4. string strSql = "SELECT * FROM userInfo";
  5. SqlDataReader reader = sqlHelper.ExecuteReader(strSql,CommandType.Text);
  6. if (reader.HasRows)
  7. {
  8. //------创建文件开始------
  9. string filePath = ""; //要导出的文件路径
  10. SaveFileDialog saveFile = new SaveFileDialog();
  11. saveFile.Filter = "Excel文件|*.xls";
  12. saveFile.DefaultExt = "xls";
  13. saveFile.FileName = "人员表";
  14. DialogResult dResult= saveFile.ShowDialog(); //获取用户点击的按钮 保存/取消
  15. filePath = saveFile.FileName; //获取导出路径
  16. //------创建文件结果------
  17. if (dResult == DialogResult.Cancel) //用户点击的按钮
  18. {
  19. MessageBox.Show("取消导出!");
  20. return;
  21. }
  22. //创建工作簿
  23. IWorkbook workBook = new HSSFWorkbook();
  24. //创建工作表
  25. ISheet sheet = workBook.CreateSheet("人员表"); // 设置工作表名称
  26. #region 创建第一行,设置列名
  27. //------------------------------------------------------------
  28. //创建第一行,第一行表示列名
  29. //循环查询出每一列
  30. IRow rowHead = sheet.CreateRow();
  31. for (int col = ; col < reader.FieldCount; col++)
  32. {
  33. rowHead.CreateCell(col).SetCellValue(reader.GetName(col)); //获取当前列的名字:reader.GetName(col)
  34. }
  35. //------------------------------------------------------------
  36. #endregion
  37. int rIndex = ; //为什么行的索引为1呢,因为没有列名
  38. while (reader.Read())
  39. {
  40. IRow currentRow = sheet.CreateRow(rIndex); //创建行
  41. int id = reader.GetInt32();
  42. string user_id = reader.GetString();
  43. string user_pwd = reader.GetString();
  44. string user_name = reader.GetString();
  45. DateTime? dTime = reader.IsDBNull() ? null : (DateTime?)reader.GetDateTime(); //声明时加"?":可空类型
  46. int? num = reader.IsDBNull() ? null : (int?)reader.GetInt32();
  47. currentRow.CreateCell().SetCellValue(id);
  48. currentRow.CreateCell().SetCellValue(user_id);
  49. currentRow.CreateCell().SetCellValue(user_pwd);
  50. currentRow.CreateCell().SetCellValue(user_name);
  51. //若嫌麻烦的童鞋,此处可以用for循环获取值,然后用switch分别判断单元格的类型,为了方便让大家理解,这里不用for循环遍历
  52. //for (int i = 0; i < reader.FieldCount; i++)
  53. //{
  54. // string ret = reader.GetDataTypeName(i); // 获取读取到列的数据类型
  55. // switch (ret)
  56. // {
  57. // case "string":
  58. // break;
  59. // case "int":
  60. // break;
  61. // }
  62. //}
  63. if (dTime == null)
  64. {
  65. //若果为NULL值,向Excel写入一个单元格,类型为Blank
  66. currentRow.CreateCell().SetCellType(CellType.Blank);
  67. }
  68. else
  69. {
  70. currentRow.CreateCell().SetCellValue((DateTime)dTime);
  71. }
  72. if (num==null)
  73. {
  74. currentRow.CreateCell().SetCellType(CellType.Blank);
  75. }
  76. else
  77. {
  78. currentRow.CreateCell().SetCellValue((int)num);
  79. }
  80. rIndex++;
  81. }
  82. //写入Excel
  83. FileStream fsRead = new FileStream(filePath, FileMode.OpenOrCreate);
  84. workBook.Write(fsRead);
  85. MessageBox.Show("导出成功");
  86. }
  87. else
  88. {
  89. MessageBox.Show("没有数据");
  90. }
  91. //2、写入Excel
  92. }

二、数据库列为日期类型,导出时

注:通过NPOI导出DateTime类型时,如果不转换为string,则需要设置一下单元格的格式

处理方法:

  1. #region 创建单元格
  2. ICell cellLockDate = currentRow.CreateCell();
  3. //赋值
  4. cellLockDate.SetCellValue((DateTime)dTime);
  5. #endregion
  6. #region 设置样式
  7. HSSFCellStyle cellstyle = (HSSFCellStyle)workBook.CreateCellStyle();
  8. HSSFDataFormat format = (HSSFDataFormat)workBook.CreateDataFormat();
  9. cellstyle.DataFormat = format.GetFormat("yyyy-mm-dd");
  10. //赋值给单元格
  11. cellLockDate.CellStyle = cellstyle;
  12. #endregion

处理导出时日期格式

  1. 第一种:日期格式
  2.  
  3. cell.setCellValue(new Date(,,));
  4. //set date format
  5. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  6. HSSFDataFormat format= demoWorkBook.createDataFormat();
  7. cellStyle.setDataFormat(format.getFormat("yyyy年m月d日"));
  8. cell.setCellStyle(cellStyle);
  9.  
  10. 第二种:保留两位小数格式
  11. cell.setCellValue(1.2);
  12. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  13. cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
  14. cell.setCellStyle(cellStyle);
  15.  
  16. 这里与上面有所不同,用的是HSSFDataFormat.getBuiltinFormat()方法,之所以用这个,是因为0.00Excel内嵌的格式,完整的Excel内嵌格式列表大家可以看这个窗口中的自定义列表:
  17.  
  18. HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();
  19. style7.DataFormat = format.GetFormat("#,##0.00");//千分位,保留两位小数
  20. 这里就不一一列出了
  21.  
  22. 第三种:货币格式
  23.  
  24. cell.setCellValue();
  25. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  26. HSSFDataFormat format= demoWorkBook.createDataFormat();
  27. cellStyle.setDataFormat(format.getFormat("¥#,##0"));
  28. cell.setCellStyle(cellStyle);
  29.  
  30. 第四种:百分比格式
  31.  
  32. cell.setCellValue();
  33. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  34. cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
  35. cell.setCellStyle(cellStyle);
  36. 此种情况跟第二种一样
  37.  
  38. 第五种:中文大写格式
  39.  
  40. cell.setCellValue();
  41. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  42. HSSFDataFormat format= demoWorkBook.createDataFormat();
  43. cellStyle.setDataFormat(format.getFormat("[DbNum2][$-804]0"));
  44. cell.setCellStyle(cellStyle);
  45.  
  46. 第六种:科学计数法格式
  47.  
  48. cell.setCellValue();
  49. HSSFCellStyle cellStyle = demoWorkBook.createCellStyle();
  50. cellStyle.setDataFormat( HSSFDataFormat.getBuiltinFormat("0.00E+00"));
  51. cell.setCellStyle(cellStyle);
  52. ---------------------
  53. 作者:liangyaomu
  54. 来源:CSDN
  55. 原文:https://blog.csdn.net/liangyaomu/article/details/52871994
  56. 版权声明:本文为博主原创文章,转载请附上博文链接!

处理其他情况汇总

三、Excel导入数据库处理

本示例没有用线程,建议用线程操作

  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. String filePath = "";
  4. OpenFileDialog ofd = new OpenFileDialog();
  5. ofd.Filter = "Excel文件|*.xls";
  6. DialogResult ret = ofd.ShowDialog();
  7. if (DialogResult.OK == ret)
  8. {
  9. filePath = ofd.FileName;
  10. FileStream fsRead = new FileStream(filePath,FileMode.Open);
  11. //创建工作簿
  12. IWorkbook workBook = new HSSFWorkbook(fsRead);
  13. string insert_module = "INSERT INTO Students VALUES ({0})";
  14. string insert_sql = "";
  15. StringBuilder sb = new StringBuilder();
  16. for (int w = ; w < workBook.NumberOfSheets; w++)
  17. {
  18. //获取工作簿中的每个工作表
  19. ISheet sheet = workBook.GetSheetAt(w);
  20. //遍历当前工作表中的行
  21. for (int r = ; r <= sheet.LastRowNum; r++)
  22. {
  23. //获取当前行
  24. IRow currentRow = sheet.GetRow(r);
  25. if (currentRow!=null) //表示该行有对象
  26. {
  27. //遍历当前行中的单元格
  28. for (int c = ; c < currentRow.LastCellNum; c++)
  29. {
  30. ICell currentCell = currentRow.GetCell(c);
  31. //判断单元格是否为空
  32. if (currentCell == null || currentCell.CellType == CellType.Blank || currentCell.ToString().Trim()=="")
  33. {
  34. //表示空值,需要往数据库中插入空值
  35. sb.Append("'',");
  36. }
  37. else
  38. {
  39. CellType cType = currentCell.CellType;
  40. #region 拼接SQL语句
  41. switch (cType)
  42. {
  43. case CellType.Numeric:
  44. if (DateUtil.IsCellDateFormatted(currentCell) == true) //单元格类型为数字,并且为日期类型
  45. {
  46. sb.Append("'").Append(currentCell.DateCellValue).Append("',");
  47. }
  48. else //不是日期类型
  49. {
  50. sb.Append("'").Append(currentCell.NumericCellValue).Append("',");
  51. }
  52. break;
  53. case CellType.String:
  54. sb.Append("'").Append(currentCell.StringCellValue).Append("',");
  55. break;
  56. }
  57. #endregion
  58. }
  59. } //currentRow.LastCellNum
  60. insert_sql += string.Format(insert_module, sb.ToString().Substring(, sb.ToString().Length - ))+";";
  61. sb.Clear();
  62. }
  63. } //sheet.LastRowNum
  64. }
  65. int res = sqlHelper.ExecuteNonQuery(insert_sql.Substring(,insert_sql.Length-),CommandType.Text);
  66. if (res == )
  67. {
  68. MessageBox.Show("导入成功");
  69. }
  70. else
  71. {
  72. MessageBox.Show("导入失败");
  73. }
  74. }
  75. else
  76. {
  77. MessageBox.Show("请选择导入文件!");
  78. }
  79. }
  1. public static int ExecuteNonQuery(string strSql, CommandType cmdType, params SqlParameter[] pms)
  2. {
  3. SqlConnection conn = new SqlConnection(conStr);
  4. SqlCommand cmd = new SqlCommand(strSql, conn);
  5. cmd.CommandType = cmdType;
  6. if (pms != null)
  7. {
  8. cmd.Parameters.AddRange(pms);
  9. }
  10. conn.Open();
  11. SqlTransaction trans = conn.BeginTransaction();
  12. try
  13. {
  14. cmd.Transaction = trans;
  15. int count = cmd.ExecuteNonQuery();
  16. if (count > )
  17. {
  18. trans.Commit(); //提交事务
  19. return ;
  20. }
  21. else
  22. {
  23. trans.Rollback(); //回滚事务
  24. return -;
  25. }
  26. }
  27. catch (Exception EX)
  28. {
  29. trans.Rollback(); //回滚事务
  30. MessageBox.Show(EX.Message.ToString());
  31. return -;
  32. }
  33. finally
  34. {
  35. conn.Close();
  36. conn.Dispose();
  37. cmd.Dispose();
  38. }
  39. }

函数

项目链接:https://pan.baidu.com/s/150J59Z3XP2DroZDy9HYfFA

提取码:nkw1

有不懂的童鞋,欢迎下方留言~~~

C#NPOI对Excel的操作、导入导出时异常处理、最全的NPOI资料在这里~的更多相关文章

  1. C# 使用NPOI 实现Excel的简单导入导出

    private void btnImport_Click(object sender, EventArgs e) { DataSet ds = new DataSet(); DataTable dt ...

  2. NPOI对excel文件的导入导出

    现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICe ...

  3. 使用NPOI进行Excel数据的导入导出

  4. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  5. VB中Excel 2010的导入导出操作

    VB中Excel 2010的导入导出操作 编写人:左丘文 2015-4-11 近来这已是第二篇在讨论VB的相关问题,今天在这里,我想与大家一起分享一下在VB中如何从Excel中导入数据和导出数据到Ex ...

  6. NPOI 在指定单元格导入导出图片

    NPOI 在指定单元格导入导出图片 Intro 我维护了一个 NPOI 的扩展,主要用来导入导出 Excel 数据,最近有网友提出了导入 Excel 的时候解析图片的需求,于是就有了本文的探索 导入E ...

  7. NPOI对Excel的操作(Sheet转DataTable、List<T>)

    通过NPOI对Excel进行操作,这里主要是读取的操作.封装到ExcelHelper操作类中. 1 using System.Collections.Generic; 2 using NPOI.HSS ...

  8. SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    * 说明:复制表(只复制结构,源表名:a 新表名:b)      select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...

  9. SQL SERVER 和ACCESS、EXCEL的数据导入导出

    SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06]     来源:Linux公社  作者:Linux 熟 悉 ...

随机推荐

  1. JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出

    这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...

  2. jquery选择器之模糊匹配

    模糊匹配主要分为前导模糊匹配,后导模糊匹配和全文模糊匹配. 前导模糊匹配[^=] 例子:选择name前缀为aa的所有div的jQuery对象. $("div[name^='aa']" ...

  3. SSM整合3(springMVC+mybatis)

    一.RequestMapping URL路径映射:置于方法上,可多个URL映射同一个方法,格式:@RequestMapping(value="item")或@RequestMapp ...

  4. 创建线程之三:实现Callable接口

    通过Callable和Future创建线程 i. 创建Callable接口的实现类,并实现call方法,该call方法将作为线程执行体,并且有返回值,可以抛出异常. ii. 创建Callable实现类 ...

  5. SSM框架之SpringMVC(2)参数绑定及自定义类型转换

    SpringMVC(2)参数绑定及自定义类型转换 1.请求参数的绑定 1.1. 请求参数的绑定说明 1.1.1.绑定机制 表单提交的数据都是k=v格式的 username=haha&passw ...

  6. Ajax跨域请求,设置content

    在使用Ajax跨域请求时,如果设置Header的ContentType为application/json,会分两次发送请求.第 一次先发送Method为OPTIONS的请求到服务器,这个请求会询问服务 ...

  7. [转]JS将图片转为base64编码

    本文转自:https://blog.csdn.net/DeMonliuhui/article/details/79731359 1.根据img标签获取base64编码/** * * @param im ...

  8. 使用Graphviz和Pyreverse绘制Python项目结构图

    使用Graphviz和Pyreverse绘制Python项目结构图 简介 Graphviz开源的图形绘制工具包 Pyreverse分析Python代码和类关系的工具 安装 安装Graphviz 官网下 ...

  9. 通过存储过程(SP)实现SQL Server链接服务器(LinkServer)的添加

    1. 背景 当系统的微服务化做的不是很高的时候,部分功能要通过DB LinkServer 来实现跨 Server 查询,当然,有时候BI抽数据.DBA数据库维护可能也会创建LinkServer. 特别 ...

  10. 201871010113-刘兴瑞《面向对象程序设计(java)》第十四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...