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. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
  2. SaaS模式的软件
  3. ios基础篇(二十四)—— 文字、图片的绘制及其自定义Button
  4. alert,confirm和prompt
  5. #linux包之lsof之lsof命令
  6. leetcode -- Largest Rectangle in Histogram TODO O(N)
  7. Android应用清单文件:AndroidManifest.xml
  8. hdu4622-Reincarnation(后缀自动机)
  9. RBAC用户角色权限设计方案
  10. jQuery 焦点图,图像文件js档
  11. JavaScript中的alert、confirm、prompt
  12. Yii2中mongodb使用ActiveRecord的数据操作
  13. 解决Chrome浏览器访问https提示“您的连接不是私密连接”的问题
  14. html中src与href的区别
  15. openwrt挂载摄像头及视频保存
  16. python语言中的数据类型之字典
  17. 转:C# lock用法
  18. nyoj 1239 引水project (河南省第八届acm程序设计大赛)
  19. Drawing house
  20. JS获取url传参

热门文章

  1. Linux 学习 (四) 帮助命令
  2. [BZOJ 2480] [SPOJ 3105] Mod
  3. BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)
  4. JavaScript继承的几种实现
  5. DMA设计
  6. crontab 误删恢复
  7. 分布式监控系统开发【day37】:服务端生成配置数据(四)
  8. SOC(网络安全管理平台)
  9. 面试:atoi() 与 itoa()函数的内部实现(转)
  10. UML建工工具