利用NPOI导入Excel,在6千条数据以内是可以的,但是现在要导入1万条,这个怎么解决?
NPOI内存大户。
如果你遇到的是内存问题。
1.继续使用NPOI,然后将程序编译成64位的。
2.使用OleDb。
3.将excel另存csv。(这应该是最快的)
能否提供一个例子呢??
@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; } }
我记得在CSDN上,我看一个人的回复,这个人叫sp1234,他曾经说,用微软提供的程序,然后把数据赋值给一个数组object[,]这样的数组,然后直接赋值给一个属性,比较快,不要一个单元格一个单元格那样赋值。
现在不是速度快慢的问题,而是直接报错,好像那个操作Excel的方法有规定只能一次导入6千多条,现在的需求是一次性导入1万多条
SXSSFWorkbook
弱弱的问一句:SXSSFWorkbook 这个东东能在ASP.NET 上面使用么?
这提问的方式给差评。
1、怎么导入的?
2、谁告诉你6000条的限制的?一开始我还真以为是有这个限制的,后来一想,我之前导入过几万条的,没出问题啊。
3、你不如直接说自己不懂编程,希望别人帮你实现得了。
谁告诉的?自己去查去。。。搞的跟你很懂编程是的。、。。无知!
没有这个限制吧,我之前记得导几万条都OK的
你一次导入内存也hold不住吧,1W条分多次读取呗
你的意思是每次一条一条的往数据库里插入,然后插1万次??
@gyangjing: 我没说一次一条一条插入,假设你1w条,你每次读取2000条,分5次。
@雨之秋水: 或许这样,才能减轻服务器的压力