C#讀取Excel及序列化柜砾、反序列化

using System;

using System.IO;

using System.Collections.Generic;

using System.Runtime.Serialization.Formatters.Binary;

using System.Data;

using System.Data.OleDb;

namespace ClientExcelTableManager

{

class Program

{

public static Dictionary DataDefineList = new Dictionary();

private static bool switchMakeTable = true;

static void Main(string[] args)

{

string currentDir = Environment.CurrentDirectory;

string outPath = currentDir + "/output";

Dictionary paths = new Dictionary();

if (switchMakeTable)

{

if (Directory.Exists(outPath))

{

ClearDirectory(outPath);

}

else

{

Directory.CreateDirectory(outPath);

}

FileInfo[] _tableNames = new DirectoryInfo(currentDir).GetFiles();

for (int i = 0; i < _tableNames.Length; i++)

{

if (!_tableNames[i].Name.Contains(".meta"))

{

if (_tableNames[i].Name.Contains(".xlsx"))

{

string key = _tableNames[i].Name.Replace(".xlsx", "");

if (!paths.ContainsKey(key))

{

paths.Add(key, _tableNames[i].FullName);

}

}

else if (_tableNames[i].Name.Contains(".xls"))

{

string key = _tableNames[i].Name.Replace(".xls", "");

if (!paths.ContainsKey(key))

{

paths.Add(key, _tableNames[i].FullName);

}

}

}

}

DataDefineList.Clear();

foreach (string key in paths.Keys)

{

DataSet _dataset = ToDataTable(paths[key]);

if (_dataset != null)

{

for (int i = 0; i < _dataset.Tables.Count; i++)

{

if (_dataset.Tables[i].TableName.ToLower().Contains("filterdatabase") || _dataset.Tables[i].TableName.ToLower().Contains("sheet")) { continue; }

if (_dataset.Tables[i].Rows.Count > 0)

{

List kickOutList = new List();

#region DataDefine

string _key0 = _dataset.Tables[i].TableName.Replace("$", "");

object[] _titles = _dataset.Tables[i].Rows[0].ItemArray;

int kk = 0;

for (int k = 0; k < _titles.Length; k++)

{

if (_titles[k].ToString().Contains("#")) { kickOutList.Add(k); continue; }

if (!string.IsNullOrEmpty(_titles[k].ToString()))

{

string _addKey = key + "_" + _key0 + "_" + _titles[k].ToString();

if (!DataDefineList.ContainsKey(_addKey)) { DataDefineList.Add(_addKey, kk); }

}

kk++;

}

#endregion

int rowCount = _dataset.Tables[i].Rows.Count;

int columnCount = _dataset.Tables[i].Columns.Count;

string[,] SingleSheetData = new string[rowCount, columnCount];

for (int j = 0; j < _dataset.Tables[i].Rows.Count; j++)

{

int kkk = 0;

for (int k = 0; k < _dataset.Tables[i].Rows[j].ItemArray.Length; k++)

{

bool kickout = false;

for (int l = 0; l < kickOutList.Count; l++)

{

if (k == kickOutList[l]) { kickout = true; continue; }

}

if (kickout == false)

{

SingleSheetData[j, kkk] = _dataset.Tables[i].Rows[j].ItemArray[k].ToString();

kkk++;

}

}

}

string newTableName = "t" + key + "_" + _key0;

SerializeTable(newTableName, outPath + "/" + newTableName + ".bytes", SingleSheetData);

}

else

{

continue;

}

}

}

}

CreateDataDefine(outPath);

if (paths.Count == 0) { Console.WriteLine("no tables."); }

}

else

{

FileInfo[] _files = new DirectoryInfo(outPath).GetFiles();

for (int i = 0; i < _files.Length; i++)

{

DisSerializeTable(_files[i].FullName);

}

Console.ReadLine();

}

}

public static void ClearDirectory(string path)

{

if (Directory.Exists(path))

{

DirectoryInfo[] _di = new DirectoryInfo(path).GetDirectories();

for (int i = 0; i < _di.Length; i++)

{

ClearDirectory(_di[i].FullName);

Directory.Delete(_di[i].FullName);

}

FileInfo[] _files = new DirectoryInfo(path).GetFiles();

for (int i = 0; i < _files.Length; i++)

{

File.Delete(_files[i].FullName);

}

}

}

public static void SerializeTable(string _tableName, string _path, string[,] _data)

{

Stream fstream = new FileStream(_path, FileMode.Create, FileAccess.ReadWrite);

BinaryFormatter bf = new BinaryFormatter();

bf.Serialize(fstream, _data);

Console.WriteLine(_tableName + " Done!");

}

public static void DisSerializeTable(string _path)

{

if (_path.Contains(".bytes") && !_path.Contains(".meta"))

{

Stream fstream = new FileStream(_path, FileMode.Open, FileAccess.Read);

BinaryFormatter bf = new BinaryFormatter();

fstream.Position = 0;

string[,] _alldatas = (string[,])bf.Deserialize(fstream);

int rowCount = _alldatas.GetLength(0);

int columnCount = _alldatas.GetLength(1);

for (int i = 0; i < rowCount; i++)

{

if (i > 3) break;

string _str = "";

for (int j = 0; j < columnCount; j++)

{

_str += _alldatas[i, j] + "|";

}

Console.WriteLine(_str);

}

}

}

public static DataSet ToDataTable(string filePath)

{

string connStr = "";

string fileType = System.IO.Path.GetExtension(filePath);

if (string.IsNullOrEmpty(fileType)) return null;

//if (fileType == ".xls")

//{

// ? ?connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";

//}

//else

//{

connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\"";

//}

string sql_F = "select * from [{0}]";

OleDbConnection conn = null;

OleDbDataAdapter da = null;

DataTable dtSheetName = null;

DataSet ds = new DataSet();

try

{

conn = new OleDbConnection(connStr);

conn.Open();

string SheetName = "";

dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

da = new OleDbDataAdapter();

for (int i = 0; i < dtSheetName.Rows.Count; i++)

{

SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"];

da.SelectCommand = new OleDbCommand(String.Format(sql_F, SheetName), conn);

DataSet dsItem = new DataSet();

da.Fill(dsItem, SheetName);

ds.Tables.Add(dsItem.Tables[0].Copy());

}

}

catch (Exception ex)

{

Console.WriteLine("Exception! \r" + ex);

}

finally

{

if (conn.State == ConnectionState.Open)

{

conn.Close();

da.Dispose();

conn.Dispose();

}

}

return ds;

}

public static void CreateDataDefine(string _out)

{

string _text = "http://This file is generated by tools!\r//Please do not modify this file!\r//RedDefine 2016-11-09.\r\rpublic class DataDefine \r{\r";

if (DataDefineList.Count > 0)

{

foreach (string key in DataDefineList.Keys)

{

_text += "\t public const int " + key + " = " + DataDefineList[key] + ";\r";

}

}

_text += "\r}";

File.WriteAllText(_out + "/DataDefine.cs", _text, System.Text.Encoding.Default);

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市换衬,隨后出現(xiàn)的幾起案子痰驱,更是在濱河造成了極大的恐慌,老刑警劉巖瞳浦,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件担映,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叫潦,警方通過查閱死者的電腦和手機(jī)蝇完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诅挑,“玉大人四敞,你說我怎么就攤上這事“瓮祝” “怎么了忿危?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)没龙。 經(jīng)常有香客問我铺厨,道長(zhǎng),這世上最難降的妖魔是什么硬纤? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任解滓,我火速辦了婚禮,結(jié)果婚禮上筝家,老公的妹妹穿的比我還像新娘洼裤。我一直安慰自己,他們只是感情好溪王,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布腮鞍。 她就那樣靜靜地躺著值骇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪移国。 梳的紋絲不亂的頭發(fā)上吱瘩,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音迹缀,去河邊找鬼使碾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祝懂,可吹牛的內(nèi)容都是我干的票摇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼嫂易,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兄朋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怜械,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傅事,沒想到半個(gè)月后缕允,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹭越,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年障本,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响鹃。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驾霜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出买置,到底是詐尸還是另有隱情粪糙,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布忿项,位于F島的核電站蓉冈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏轩触。R本人自食惡果不足惜寞酿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脱柱。 院中可真熱鬧伐弹,春花似錦、人聲如沸榨为。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昧狮,卻和暖如春景馁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逗鸣。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工合住, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撒璧。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓透葛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親卿樱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子僚害,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容