WebEnh

.net7 mvc jquery bootstrap json 学习中 第一次学PHP,正在研究中。自学进行时... ... 我的博客 https://enhweb.github.io/ 不错的皮肤:darkgreentrip,iMetro_HD
随笔 - 1079, 文章 - 1, 评论 - 75, 阅读 - 174万
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
 

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);
                            }
                            
                        }
                    }
                }
            }
        }

    }
}
复制代码

 

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2016-07-18 CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
2016-07-18 C#中==与Equals方法的区别
2016-07-18 一个简单得不能再简单的“ORM”了
2016-07-18 msbuild ConfuserEx.Build 加密
2016-07-18 C#生成注册码
2016-07-18 从多个XML文档中读取数据用于显示webapi帮助文档
2016-07-18 ASP.NET MVC SSO 单点登录设计与实现
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

了解更多