下面通過圖文並茂的方式給大家介紹asp.net中大量匯出access某表內容到word文檔的方法,具體詳情如下:
一、需求:
需要將表中每一條記錄中的某些內容匯出在一個word文檔中,並將這些文檔儲存在指定檔案夾目錄下
二、介面,簡單設計如下:
三、添加office相關引用
添加後可在方案總管中看到:
四、添加form1中的引用
using System.Data.OleDb;using System.Data.SqlClient;using System.IO;using Microsoft.Office.Core;using Word=Microsoft.Office.Interop.Word;using System.Reflection;
五、表單Form1中代碼如下:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OleDb;using System.Data.SqlClient;using System.IO;using Microsoft.Office.Core;using Word=Microsoft.Office.Interop.Word;using System.Reflection;using System.Threading;//線程需用,進程中namespace word{ delegate void ShowProgressDelegate(int totalStep, int currentStep); //定義委託,非同步呼叫 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public string filepath = "D:\\zjy\\其他\\NCTDCBJYQ04.mdb"; //資料庫所在位置設定 public string path; //輸出路徑 private void Form1_Load(object sender, EventArgs e) { string sqlstr = "select OBJECTID,CBFBM,CBFMC from CBF"; //string sqlstr = "select * from CBF"; DataSet ds = AccessDAO.getDataSetFromAccessTable(sqlstr, filepath); this.dataGridView1.DataSource = ds.Tables[0].DefaultView; dataGridView1.AllowUserToAddRows = false; } private void textBox1_MouseClick(object sender, MouseEventArgs e)//輸出路徑設定 { FolderBrowserDialog dilog = new FolderBrowserDialog(); dilog.Description = "請選擇檔案夾"; if (dilog.ShowDialog() == DialogResult.OK || dilog.ShowDialog() == DialogResult.Yes) { path = dilog.SelectedPath; this.textBox1.Text = path; } } object pathword; //聲明檔案路徑變數 private void button2_Click(object sender, EventArgs e) //批量輸出 { ParameterizedThreadStart start = new ParameterizedThreadStart(SetProgress); Thread progressThread = new Thread(start); progressThread.IsBackground = true;//標記為後台進程,在視窗退出時,正常退出 progressThread.Start(); } /// <summary> /// 重新整理進度條 /// </summary> /// <param name="totalStep"></param> /// <param name="currentStep"></param> void ShowProgress(int totalStep, int currentStep) { this.progressBar1.Maximum = totalStep; this.progressBar1.Value = currentStep; if (this.progressBar1.Value * 100 / progressBar1.Maximum != 100) { this.label2.Text = "當前輸出進度為:" + this.progressBar1.Value * 100 / progressBar1.Maximum + "%" + " 請耐心等待:)"; } else if (this.progressBar1.Value * 100 / progressBar1.Maximum == 100) { this.label2.Text = "輸出結束!"; } } /// <summary> /// 設定當前進度 /// </summary> /// <param name="state"></param> void SetProgress(object state) { if (this.textBox1.Text == "") { MessageBox.Show("請選擇檔案輸出路徑", "提示"); } else { for (int i = 0; i < this.dataGridView1.Rows.Count; i++) //遍曆擷取table中需要的值,並分別建立word文檔 { #region 開啟進度條 Thread.Sleep(1); object[] objs = new object[] { this.dataGridView1.RowCount, i+1 }; //非同步呼叫 this.Invoke(new ShowProgressDelegate(ShowProgress), objs); #endregion #region 擷取word中需要添加的內容 string dm = this.dataGridView1.Rows[i].Cells[1].Value.ToString();//承包方編碼 string mc = this.dataGridView1.Rows[i].Cells[2].Value.ToString();//承包方名稱 #endregion #region 建立word文檔,並將內容寫入word,並儲存起來 //初始設定變數 object Nothing = Missing.Value; //COM調用時用於佔位 object format = Word.WdSaveFormat.wdFormatDocument; //Word文檔的儲存格式 Word.ApplicationClass wordApp = new Word.ApplicationClass(); //聲明一個wordAPP對象 Word.Document worddoc = wordApp.Documents.Add(ref Nothing, ref Nothing, ref Nothing, ref Nothing);//建立一個word對象 //向文檔中寫入內容 string wordstr = "承包方代碼:" + dm + "\n" + "承包方名稱:" + mc; worddoc.Paragraphs.Last.Range.Text = wordstr; //儲存文檔 pathword = path + "\\" + dm; //設定檔案儲存路徑 worddoc.SaveAs(ref pathword, ref format, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing); //關閉文檔 worddoc.Close(ref Nothing, ref Nothing, ref Nothing); //關閉worddoc文檔對象 wordApp.Quit(ref Nothing, ref Nothing, ref Nothing); //關閉wordApp組對象 #endregion } MessageBox.Show("文檔建立成功!","提示"); } } }}
六、讀取資料庫中表需要的資料庫類AccessDAO.cs代碼如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.OleDb;using System.Data.SqlClient;using System.Text.RegularExpressions; //Regex引用所需namespace word{ //access的資料提供者 class AccessDAO { public static class Property { public static string accessFilePath = "d:\\nCTDCBJYQ04DataSet.mdb"; //若放入主程式,則可如下設定 //one mainFrm = (one)this.Owner; //string prjName = mainFrm.laPrj.Text; //string prjPath = mainFrm.laFile_Path.Text; // public static string accessFilePath = prjPath + "\\向量資料\\" + prjName + ".mdb"; } //從access資料庫擷取資料 //dataFilePath指定access檔案的路徑 //sql指定資料庫的查詢語句 //DataSet為查詢返回的資料集 public static DataSet getDataSetFromAccessTable(string sql, string dataFilePath) { // 串連資料庫 OleDbConnection connct = new OleDbConnection(); string oleDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataFilePath; connct.ConnectionString = oleDB; //建立命令 OleDbCommand command = new OleDbCommand(sql, connct); //開啟資料庫 connct.Open(); //執行命令 DataSet dataSet = new DataSet(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command); dataAdapter.Fill(dataSet); // 關閉串連 connct.Close(); return dataSet; } //更新或者插入資料到access資料庫 //dataFilePath指定access檔案的路徑 //sql指定資料庫的更新或者插入語句 //傳回值int表示此次更新影響的行數 public static int updateAccessTable(string sql, string dataFilePath) { // 串連資料庫 OleDbConnection connct = new OleDbConnection(); string oleDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataFilePath; connct.ConnectionString = oleDB; //開啟資料庫 connct.Open(); //執行命令 OleDbCommand myCommand = new OleDbCommand(sql, connct); int res = myCommand.ExecuteNonQuery(); // 關閉串連 connct.Close(); return res; } //更新或者插入資料到access資料庫 //dataFilePath指定access檔案的路徑 //command指定操作(更新或者插入)資料庫的命令 //傳回值int表示此次更新影響的行數 public static int updateAccessTable(OleDbCommand command, string dataFilePath) { // 串連資料庫 OleDbConnection connct = new OleDbConnection(); string oleDB = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dataFilePath; connct.ConnectionString = oleDB; //開啟資料庫 connct.Open(); //執行命令 //OleDbCommand myCommand = new OleDbCommand(sql, connct); command.Connection = connct; int res = command.ExecuteNonQuery(); // 關閉串連 connct.Close(); return res; } public bool ckDigital_Num(string digitalItem, int digitalNum) //正則檢查是否為數字,且位元一定 { bool isDigital_Num = false; Regex reGen = new Regex(@"^\d{" + digitalNum.ToString("F0") + "}$"); //Regex,n位元字 if (reGen.IsMatch(digitalItem)) isDigital_Num = true; return isDigital_Num; } }}
ok了,至此就可完成大量匯出成word文檔了