使用NPOI读取Excel数据并写入SQLite

首先,我们来建一个数据库,我们就叫Hello.db(不一定是db后缀,你可以sqlite,sqlite3,db3)都可以作为识别,然后往里面建一个空的表格,如下图所示

 

 

 

然后建一个Excel表格,往表格里面写入一些数据,我这里只是Demo形式,可以根据自己的实际情况,稍作修改

然后开始建一个新的项目,我这里用的是WPF,你可以使用Core,Console,Winform都可以,我这里提供思路,仅供参考

 

 

 

然后引用一下图中的dll程序集,主要是SQLite和NPOI,你可以到Nuget去下载,Nuget命令,都可以达到目的,请随意

然后我们来写一下用户界面的代码

    <Grid>
        <Button Content="ExcelToSQLite" 
                Height="100"
                Width="200"
                Name="Import"
                Click="Import_Click"/>
    </Grid>

 

再来看看后端的代码如下图

        //数据库连接
        SQLiteConnection SQLiteConnections;
        public MainWindow()
        {
            InitializeComponent();
            SQLiteConnections = new SQLiteConnection("Data Source=Hello.db;Version=3;");
            SQLiteConnections.Open();
        }

然后写一下Button的事件

        private void Import_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog openfiledialog = new OpenFileDialog();
            openfiledialog.Filter = "*.xls|*.xls|*.xlsx|*.xlsx";
            if (openfiledialog.ShowDialog() == true)
            {
                string name = openfiledialog.FileName;
                ImportExcel(name);
            }
        }

再下来写NPOI读取Excel的方法,然后再Button 事件里面调用即可,你也可以自己封装一下代码

 public DataTable ImportExcel(string filePath)
        {
            DataTable dt = new DataTable();
            using (FileStream fsRead = System.IO.File.OpenRead(filePath))
            {
                IWorkbook wk = null;
                //获取后缀名
                string extension = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower();
                //判断是否是excel文件
                if (extension == ".xlsx" || extension == ".xls")
                {
                    //判断excel的版本
                    if (extension == ".xlsx")
                    {
                        wk = new XSSFWorkbook(fsRead);
                    }
                    else
                    {
                        wk = new HSSFWorkbook(fsRead);
                    }
                    //获取第一个sheet
                    ISheet sheet = wk.GetSheetAt(0);
                    //获取第一行
                    IRow headrow = sheet.GetRow(0);
                    //创建列
                    for (int i = headrow.FirstCellNum; i < headrow.Cells.Count; i++)
                    {
                        DataColumn datacolum = new DataColumn("F" + (i + 1));
                        dt.Columns.Add(datacolum);
                    }
                    //读取每行,从第二行起
                    for (int r = 1; r <= sheet.LastRowNum; r++)
                    {
                        bool result = false;
                        DataRow dr = dt.NewRow();
                        //获取当前行
                        IRow row = sheet.GetRow(r);
                        //读取每列
                        for (int j = 0; j < row.Cells.Count; j++)
                        {
                            ICell cell = row.GetCell(j); //一个单元格
                            dr[j] = GetCellValue(cell); //获取单元格的值
                            //全为空则不取
                            if (dr[j].ToString() != "")
                            {
                                result = true;
                            }
                        }
                        if (result == true)
                        {
                            dt.Rows.Add(dr); //把每行追加到DataTable
                        }
                    }
                }

            }
            int a = dt.Rows.Count;
            int b = dt.Columns.Count;
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                string c = dt.Rows[0][1].ToString();
                string sql = "insert into Student (Name,Class,Age,Sex) values('" + dt.Rows[i][0].ToString() + "','" + dt.Rows[i][1].ToString() + "','" + dt.Rows[i][2].ToString() + "','" + dt.Rows[i][3].ToString() + "')";
                SQLiteCommand command = new SQLiteCommand(sql, SQLiteConnections);
                command.ExecuteNonQuery();
            }
            MessageBox.Show("导入成功");
            return dt;
        }

在下来我们来检查一下每个表格的数据方法,如下图

private static string GetCellValue(ICell cell)
        {
            if (cell == null)
                return string.Empty;
            switch (cell.CellType)
            {
                case CellType.Blank: //空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写)
                    return string.Empty;
                case CellType.Boolean: //bool类型
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Numeric: //数字类型
                    if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型
                    {
                        return cell.DateCellValue.ToString();
                    }
                    else //其它数字
                    {
                        return cell.NumericCellValue.ToString();
                    }
                case CellType.Unknown: //无法识别类型
                default: //默认类型
                    return cell.ToString();//
                case CellType.String: //string 类型
                    return cell.StringCellValue;
                case CellType.Formula: //带公式类型
                    try
                    {
                        HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
                        e.EvaluateInCell(cell);
                        return cell.ToString();
                    }
                    catch
                    {
                        return cell.NumericCellValue.ToString();
                    }
            }
        }

到这里我们的代码就写完了,我们来运行一下,看看效果怎么样

选择我们事先写好的Excel表格,选择它,然后点击打开的按钮

有提示成功了。

你以为到这里就结束了吗?不是的,这是程序提示成功了而已,那我们去看看SQLite数据看看有没有数据,记得开始的时候我们的SQLite是没有数据的,现在我们打开看看

到现在为止,整个流程就结束了,因为Excel的数据完全的导入到了SQLite数据库中,我们的目的达到了。感谢您的欣赏!

posted @ 2019-01-29 21:43  Lexan  阅读(765)  评论(0编辑  收藏  举报