zoukankan      html  css  js  c++  java
  • 使用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数据库中,我们的目的达到了。感谢您的欣赏!

  • 相关阅读:
    2019年3月6日 980. Unique Paths III
    2019年3月05日 961. N-Repeated Element in Size 2N Array
    2019年3月4日 701. Insert into a Binary Search Tree
    2019年3月1日 804. Unique Morse Code Words
    2019年2月28日 654. Maximum Binary Tree
    2019年2月26日 Unique Email Addresses、To Lower Case、Encode and Decode TinyURL
    Nexus Repository Manager 3 远程命令执行漏洞(CVE-2020-10199)复现
    常见的Web源码泄漏漏洞及其利用
    Nmap-脚本检测CVE漏洞
    Vulnhub-dpwwn-01靶机过关记录
  • 原文地址:https://www.cnblogs.com/R00R/p/10335961.html
Copyright © 2011-2022 走看看