在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Com.urp.command.FileFrameWork(5) 好久没写了,呵呵,一个多月了,不知道有没关心这个系列的朋友,如果有,只能说声对不起了。主要是项目比较忙,再加上最近一直在玩三国志11的游戏,又浪费不少时间,于是晚上结束后也没多少时间来做自己的东西了。有时候想想,明明是国人自己的文化,却要玩有别人来做成的游戏,岂不也是一种悲哀,而且据说在中国,三国志已经被光荣注册成功了商标,所以国人以后开发的三国系列的游戏的命名都会是一种困难了吧。最近这次有差不多做了2周吧,改动比较大,除了把对于DataTable的支持加进去以后,重要是整个DataAdapter包结构的变化比较大,且听我一一道来:) 首先要说一下自己写的一个帮助类ExcelHelper。可以用两种方式访问Excel文件,一种是以Excel的Com组件的形式,一种是最简单的把Excel看作是数据库。其实很多的内容网上都已经有了,但都比较分散,都只提到了一种或两种,没有统一到一起。代码如下:
using System;
using System.IO; using System.Collections; using System.Text; using System.Data; using System.Data.OleDb; namespace com.urp.command.FileFrameWork.Helper }
private readonly string readConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source={0};" +"Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"; HDR=YES 表示将sheet的第一行作为列名,所以我们默认excel的首行是列名。 IMEX=1 表示大致的意思是使用导入的模式,把数字也作为字符串来操作。
public DataTable GetByDataTable() { Command.CommandText = "select * from [sheet1$]"; DataTable dt = new DataTable(); Builder = new OleDbCommandBuilder(Adapter); Adapter.Fill(dt); return dt; } public void SetByDataTable(DataTable dataTable) { Command.CommandText = "select * from [sheet1$]"; DataTable dt = new DataTable("sheet1"); Builder = new OleDbCommandBuilder(Adapter); Adapter.Fill(dt); Adapter.InsertCommand = Builder.GetInsertCommand(); Adapter.Update(dataTable); dt = null; }
public void NewTable(DataTable dataTable) { StringBuilder columnNames = new StringBuilder("Create Table "); columnNames.Append("sheet1("); foreach(DataColumn column in dataTable.Columns) { columnNames.Append(column.ColumnName); columnNames.Append(" varchar, "); } columnNames.Replace(", ", ")", columnNames.Length - 2 , 2); Command.CommandText = columnNames.ToString(); Command.ExecuteNonQuery(); }
public Array GetByRangeArray2(int rowStart, int columnStart, int rowEnd, int columnEnd) { _range = _workSheet.get_Range(CellStr(rowStart, columnStart), CellStr(rowEnd, columnEnd)); return (Array)_range.Value2; } public void SetByRangeArray2(int rowStart, int columnStart, int rowEnd, int columnEnd, Array values) { _range = _workSheet.get_Range(CellStr(rowStart, columnStart), CellStr(rowEnd, columnEnd)); _range.Value2 = values; } { return (char)(65 + columnIndex) + (++rowIndex).ToString(); } 从DataTable可以获得列信息,那Array呢,怎么样获得呢,Array又是如何的一个结构,如何来操作呢。 这样子以后对于Excel的两种访问方式都写完了,以后还要做一个性能方面的比较,来证实我的想法的正确性,剩下的就是要对返回的数据进行处理了,这个下次在分析了。因为我读取和写入文件都只访问一次文件,而最花时间的地方就在这,所以,如果要加做进度条的话可能就无法实现了,这个问题以后在做考虑吧。 |
请发表评论