Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 927|回复: 0

[C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-27 09:51:04 | 显示全部楼层 |阅读模式
     

    1.OpenXmlSDK是个很好的类库,可惜只能通过C#调用,C#的童鞋又福气了。

    2.服务端程序由于没法安装office,所以这个对asp.net网站来说是最理想的库了。需要.net 4.0版本以上.

    3.以流形式,sax模型读取大文件。

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet;
    
    namespace ConsoleApplication1
    {
        class ProductObject
        {
    
            public String xinghao;//型号
            public String changjia;//厂家
            public String pihao;//批号
            public String fengzhuang;//封装
            public String shuliang;//数量
    
            public void init() 
            {
                //初始化成员变量
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                String fileName = @"E:\software\TestData\xlsx\test.xlsx";
                Program pro = new Program();
                pro.ReadAllCellValues(fileName);
            }
    
            void CallSqlInsert(ProductObject po)
            {
                //call bl interface method to insert data to database.
                //注意处理空值的情况
                Console.Out.Write("{0}:{1}:{2}:{3}:{4} ", po.xinghao, po.changjia, po.pihao, po.fengzhuang, po.shuliang);
                Console.Out.WriteLine();
            }
    
            String GetCellValue(WorkbookPart workbookPart,Cell c) 
            {
                string cellValue;
                if (c.DataType != null && c.DataType == CellValues.SharedString)
                {
                    SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText));
                    cellValue = ssi.Text.Text;
                }
                else
                {
                    cellValue = c.CellValue.InnerText;
                }
                return cellValue;
            }
    
            Boolean StoreProductObject(OpenXmlReader reader, WorkbookPart workbookPart, ProductObject po) 
            {
                reader.ReadFirstChild();
                if (reader.ElementType != typeof(Cell))
                {
                    return false;
                }
    
                Cell c = (Cell)reader.LoadCurrentElement();
                po.xinghao = GetCellValue(workbookPart,c);
    
                reader.ReadNextSibling();
                c = (Cell)reader.LoadCurrentElement();
                po.changjia = GetCellValue(workbookPart,c);
    
                reader.ReadNextSibling();
                c = (Cell)reader.LoadCurrentElement();
                po.pihao = GetCellValue(workbookPart,c);
    
                reader.ReadNextSibling();
                c = (Cell)reader.LoadCurrentElement();
                po.fengzhuang = GetCellValue(workbookPart,c);
    
                reader.ReadNextSibling();
                c = (Cell)reader.LoadCurrentElement();
                po.shuliang = GetCellValue(workbookPart,c);
                return true;
            }
    
            //这种SAX的读取方式很高效,至于是读一行提交一行好还是读100行再提交100行好自己决定.
            //这种SAX的方式对读取超大xlsx文件不存在内存占用过大和慢的问题.
            void ReadAllCellValues(string fileName)
            {
                using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
                {
                    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
                    ProductObject po = new ProductObject();
    
                    foreach (WorksheetPart worksheetPart in workbookPart.WorksheetParts)
                    {
                        OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);
                        while (reader.Read())
                        {
                            if (reader.ElementType == typeof(Worksheet))
                            {
                                if (reader.ReadFirstChild())
                                {
                                    SheetProperties properties = (SheetProperties)reader.LoadCurrentElement();
                                    //只处理名字是Sheet1的,其他不处理
                                    if (properties.CodeName != "Sheet1")
                                    {
                                        break;
                                    }
                                }
                            }
                            if (reader.ElementType == typeof(Row))
                            {
                                //先调用一个成员函数初始化init,自己写.
                                po.init();
                                if (StoreProductObject(reader, workbookPart, po)) 
                                {
                                    CallSqlInsert(po);
                                }
                                
                            }
                        }
                    }
                }
            }
    
        }
    }

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 21:25 , Processed in 0.056683 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表