首页 新闻 赞助 找找看

NPOI Excel 导入1万条数据

0
[已解决问题] 解决于 2016-08-17 13:46

利用NPOI导入Excel,在6千条数据以内是可以的,但是现在要导入1万条,这个怎么解决?

gyangjing的主页 gyangjing | 初学一级 | 园豆:4
提问于:2016-08-15 09:53
< >
分享
最佳答案
0

NPOI内存大户。

如果你遇到的是内存问题。

1.继续使用NPOI,然后将程序编译成64位的。

2.使用OleDb。

3.将excel另存csv。(这应该是最快的)

奖励园豆:5
写代码的小2B | 老鸟四级 |园豆:4371 | 2016-08-15 10:26

能否提供一个例子呢??

gyangjing | 园豆:4 (初学一级) | 2016-08-15 10:47

@gyangjing: 

public interface IReader
    {
        DataTable Read(String path);
    }

    //使用NPOI读取Excel
    public class NPOIExcelReader : IReader
    {
        public DataTable Read(String path)
        {
            var dt = new DataTable();

            using (var fs = File.OpenRead(path))
            {
                var xss = new XSSFWorkbook(fs);
                var sheet = xss.GetSheetAt(0);

                var temp = xss.NumberOfSheets;

                var header = sheet.GetRow(0);
                foreach (var col in header)
                {
                    dt.Columns.Add(col.StringCellValue);
                }

                for (var i = 1; i < sheet.LastRowNum; i++)
                {
                    var row = sheet.GetRow(i);

                    var dr = dt.NewRow();

                    dr[0] = row.GetCell(0).StringCellValue;
                    dr[1] = row.GetCell(1).StringCellValue;
                    dr[2] = row.GetCell(2).DateCellValue;
                    dr[3] = row.GetCell(3).NumericCellValue;

                    dt.Rows.Add(dr);
                }
            }

            return dt;
        }
    }

    //使用OLEDB读取Excel
    public class OleDbExcelReader : IReader
    {
        public DataTable Read(String path)
        {
            var strConn = $"Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 XML;Data Source={path};";
            using (var conn = new OleDbConnection(strConn))
            {
                conn.Open();

                var sheets = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                var adapter = new OleDbDataAdapter($"SELECT * FROM [{sheets.Rows[0]["TABLE_NAME"]}]", strConn);
                var dt = new DataTable();
                adapter.Fill(dt);

                return dt;
            }
        }
    }

    //使用OLEDB读取CSV
    public class CSVReader : IReader
    {
        public DataTable Read(String path)
        {
            var fullPath = Path.GetFullPath(path);
            var strConn = $@"Provider=Microsoft.Jet.OleDb.4.0;Extended Properties='Text;HDR=YES;FMT=Delimited';Data Source={Path.GetDirectoryName(fullPath)};";
            using (var conn = new OleDbConnection(strConn))
            {
                conn.Open();

                var adapter = new OleDbDataAdapter($"SELECT * FROM [{ Path.GetFileName(path) }]", strConn);
                var dt = new DataTable();
                adapter.Fill(dt);
                return dt;
            }
        }
    }

    //纯文本读取CSV
    public class TextReader : IReader
    {
        public DataTable Read(String path)
        {
            var dt = new DataTable();
            using (var reader = new StreamReader(path, Encoding.Default))
            {
                var header = reader.ReadLine().Split(',');
                foreach (var item in header)
                {
                    dt.Columns.Add(item);
                }

                String line = null;
                while ((line = reader.ReadLine()) != null)
                {
                    var array = line.Split(',');

                    var row = dt.NewRow();
                    for (var i = 0; i < array.Length; i++)
                        row[i] = array[i];

                    dt.Rows.Add(row);
                }
            }
            return dt;
        }
    }
写代码的小2B | 园豆:4371 (老鸟四级) | 2016-08-15 10:52
其他回答(5)
0

我记得在CSDN上,我看一个人的回复,这个人叫sp1234,他曾经说,用微软提供的程序,然后把数据赋值给一个数组object[,]这样的数组,然后直接赋值给一个属性,比较快,不要一个单元格一个单元格那样赋值。

顾晓北 | 园豆:10844 (专家六级) | 2016-08-15 10:15

现在不是速度快慢的问题,而是直接报错,好像那个操作Excel的方法有规定只能一次导入6千多条,现在的需求是一次性导入1万多条

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-15 10:47
0

SXSSFWorkbook

晋升中的FE | 园豆:519 (小虾三级) | 2016-08-15 10:33

弱弱的问一句:SXSSFWorkbook 这个东东能在ASP.NET 上面使用么?

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-15 10:49
0

这提问的方式给差评。

1、怎么导入的?

2、谁告诉你6000条的限制的?一开始我还真以为是有这个限制的,后来一想,我之前导入过几万条的,没出问题啊。

3、你不如直接说自己不懂编程,希望别人帮你实现得了。

爱编程的大叔 | 园豆:30839 (高人七级) | 2016-08-15 13:32

谁告诉的?自己去查去。。。搞的跟你很懂编程是的。、。。无知!

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-15 13:37
0

没有这个限制吧,我之前记得导几万条都OK的

jello chen | 园豆:7306 (大侠五级) | 2016-08-15 14:01
0

你一次导入内存也hold不住吧,1W条分多次读取呗

雨之秋水 | 园豆:649 (小虾三级) | 2016-08-15 16:07

你的意思是每次一条一条的往数据库里插入,然后插1万次??

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-15 16:18

@gyangjing: 我没说一次一条一条插入,假设你1w条,你每次读取2000条,分5次。

支持(0) 反对(0) 雨之秋水 | 园豆:649 (小虾三级) | 2016-08-15 16:23

@雨之秋水: 或许这样,才能减轻服务器的压力

支持(0) 反对(0) gyangjing | 园豆:4 (初学一级) | 2016-08-15 16:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册