C#读写Excel
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Office; using Microsoft.Office.Interop.Excel; using System.IO; using System.Reflection; using System.Data; using System.Data.OleDb; namespace ExcelDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); OutLog("**************欢迎使用**************"); } private void button1_Click(object sender, EventArgs e) { OpenFileDialog open = new OpenFileDialog(); //定义一个文件打开控件 OpenFileDialog ofd = new OpenFileDialog(); //设置打开对话框的初始目录,默认目录为exe运行文件所在的路径 //ofd.InitialDirectory = Application.StartupPath; //设置打开对话框的标题 ofd.Title = "请选择要打开的文件"; //设置打开对话框可以多选 ofd.Multiselect = true; //设置对话框打开的文件类型 ofd.Filter = "excel03文件(*.xls)|*.xls|excel07文件(*.xlsx)|*.xlsx"; //设置文件对话框当前选定的筛选器的索引 ofd.FilterIndex = 2; //设置对话框是否记忆之前打开的目录 ofd.RestoreDirectory = true; if (ofd.ShowDialog() == DialogResult.OK) { //获取用户选择的文件完整路径 string[] filePath = ofd.FileNames; //获取对话框中所选文件的文件名和扩展名,文件名不包括路径 string[] fileName = ofd.SafeFileNames; for (int i = 0; i < fileName.Length; i++) { OutLog("用户选择的文件目录为:" + filePath[i]); OutLog("用户选择的文件名称为:" + fileName[i]); checkedListBox1.Items.Add(filePath[i], true); } //OutLog("**************选中文件的内容**************"); //using (FileStream fsRead = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Read)) //{ // //定义二进制数组 // byte[] buffer = new byte[1024 * 1024 * 5]; // //从流中读取字节 // int r = fsRead.Read(buffer, 0, buffer.Length); // OutLog(Encoding.Default.GetString(buffer, 0, r)); //} } } /// <summary> /// 输出日志 /// </summary> /// <param name="strLog"></param> private void OutLog(string strLog) { //如果日志信息长度超过1000行,则自动清空 if (txt_FileInfo.GetLineFromCharIndex(txt_FileInfo.Text.Length) > 1000) { //清空文本 txt_FileInfo.Clear(); } txt_FileInfo.AppendText(DateTime.Now.ToString("HH:mm:ss ") + strLog + "\r\n"); } private void linkLabel1_Click(object sender, EventArgs e) { for (int i = 0; i < checkedListBox1.Items.Count; i++) { checkedListBox1.SetItemCheckState(i, CheckState.Checked); } } private void linkLabel2_Click(object sender, EventArgs e) { for (int i = 0; i < checkedListBox1.Items.Count; i++) { checkedListBox1.SetItemCheckState(i, CheckState.Unchecked); } } private void button2_Click(object sender, EventArgs e) { OutLog("准备中..."); #region init string path = @"D:\" + DateTime.Now.Second + DateTime.Now.Millisecond + ".xlsx"; System.Data.DataTable MyDataTable = new System.Data.DataTable(); MyDataTable.Columns.Add(new DataColumn("存档编号", typeof(string))); MyDataTable.Columns.Add(new DataColumn("任务描述", typeof(string))); MyDataTable.Columns.Add(new DataColumn("具体位置", typeof(string))); MyDataTable.Columns.Add(new DataColumn("开始时间", typeof(string))); MyDataTable.Columns.Add(new DataColumn("结束时间", typeof(string))); MyDataTable.Columns.Add(new DataColumn("工作情况", typeof(string))); MyDataTable.Columns.Add(new DataColumn("名称1", typeof(string))); MyDataTable.Columns.Add(new DataColumn("型号1", typeof(string))); MyDataTable.Columns.Add(new DataColumn("数量1", typeof(string))); MyDataTable.Columns.Add(new DataColumn("名称2", typeof(string))); MyDataTable.Columns.Add(new DataColumn("型号2", typeof(string))); MyDataTable.Columns.Add(new DataColumn("数量2", typeof(string))); MyDataTable.Columns.Add(new DataColumn("名称3", typeof(string))); MyDataTable.Columns.Add(new DataColumn("型号3", typeof(string))); MyDataTable.Columns.Add(new DataColumn("数量3", typeof(string))); MyDataTable.Columns.Add(new DataColumn("名称4", typeof(string))); MyDataTable.Columns.Add(new DataColumn("型号4", typeof(string))); MyDataTable.Columns.Add(new DataColumn("数量4", typeof(string))); #endregion DataRow dr; List<string[]> lstrs = new List<string[]>(); for (int i = 0; i < checkedListBox1.Items.Count; i++) { string[] str = new string[18]; System.Data.DataTable dt = ExcelToDS(checkedListBox1.Items[i].ToString()); //string IDCard = dt.Rows[0][2].ToString(); //string miaoshu = dt.Rows[3][0].ToString(); //string Position = dt.Rows[4][0].ToString(); //string StartTime = dt.Rows[5][0].ToString(); //string OverTime = dt.Rows[5][2].ToString(); //string Qingkuang = dt.Rows[6][0].ToString(); //string name_1 = dt.Rows[8][0].ToString(); //string Type_1 = dt.Rows[8][1].ToString(); //string Num_1 = dt.Rows[8][4].ToString(); //string name_2 = dt.Rows[9][0].ToString(); //string Type_2 = dt.Rows[9][1].ToString(); //string Num_2 = dt.Rows[9][4].ToString(); //string name_3 = dt.Rows[10][0].ToString(); //string Type_3 = dt.Rows[10][1].ToString(); //string Num_3 = dt.Rows[10][4].ToString(); //string name_4 = dt.Rows[11][0].ToString(); //string Type_4 = dt.Rows[11][1].ToString(); //string Num_4 = dt.Rows[11][4].ToString(); str[0] = dt.Rows[0][2].ToString().Split(':')[1] + "."; str[1] = dt.Rows[3][0].ToString().Split(':')[1]; str[2] = dt.Rows[4][0].ToString().Split(':')[1]; str[3] = dt.Rows[5][0].ToString().Split(':')[1]; str[4] = dt.Rows[5][2].ToString().Split(':')[1]; str[5] = dt.Rows[6][0].ToString().Split(':')[1]; str[6] = dt.Rows[8][0].ToString().Split(':')[1]; str[7] = dt.Rows[8][1].ToString().Split(':')[1]; str[8] = dt.Rows[8][4].ToString().Split(':')[1]; str[9] = dt.Rows[9][0].ToString().Split(':')[1]; str[10] = dt.Rows[9][1].ToString().Split(':')[1]; str[11] = dt.Rows[9][4].ToString().Split(':')[1]; str[12] = dt.Rows[10][0].ToString().Split(':')[1]; str[13] = dt.Rows[10][1].ToString().Split(':')[1]; str[14] = dt.Rows[10][4].ToString().Split(':')[1]; str[15] = dt.Rows[11][0].ToString().Split(':')[1]; str[16] = dt.Rows[11][1].ToString().Split(':')[1]; str[17] = dt.Rows[11][4].ToString().Split(':')[1]; //DataRow dr = new System.Data.DataRow(); //dr = MyDataTable.NewRow(); //dr["存档编号"] = IDCard; //dr["任务描述"] = miaoshu; //dr["具体位置"] = Position; //dr["开始时间"] = StartTime; //dr["结束时间"] = OverTime; //dr["工作情况"] = Qingkuang; //dr["名称1"] = name_1; //dr["型号1"] = Type_1; //dr["数量1"] = Num_1; //dr["名称2"] = name_2; //dr["型号2"] = Type_2; //dr["数量2"] = Num_2; //dr["名称3"] = name_3; //dr["型号3"] = Type_3; //dr["数量3"] = Num_3; //dr["名称4"] = name_4; //dr["型号4"] = Type_4; //dr["数量4"] = Num_4; //MyDataTable.Rows.Add(dr); lstrs.Add(str); } CreateExcelFile(path, lstrs); OutLog("准备完成!开始添加"); DataSet ds = new System.Data.DataSet(); ds.Tables.Add(MyDataTable); OutLog("OK,处理完成,文件路径:" + path); } public System.Data.DataTable ExcelToDS(string Path) { string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = null; DataSet ds = null; strExcel = "select * from [sheet1$]"; myCommand = new OleDbDataAdapter(strExcel, strConn); ds = new DataSet(); myCommand.Fill(ds, "table1"); return ds.Tables[0]; } public string CreateNewExcel() { string path = "D:/" + DateTime.Now.Second + DateTime.Now.Millisecond + ".xlsx"; if (!File.Exists(path)) { File.Create(path).Close(); } OutLog("创建Excel文件,路径:" + path); return path; } public void DSToExcel(string Path, DataSet oldds) { //先得到汇总EXCEL的DataSet 主要目的是获得EXCEL在DataSet中的结构 string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + Path + ";Extended Properties=Excel 8.0"; OleDbConnection myConn = new OleDbConnection(strCon); string strCom = "select * from [Sheet1$]"; myConn.Open(); OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn); System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand); //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。 builder.QuotePrefix = "["; //获取insert语句中保留字符(起始位置) builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置) //DataSet newds = new DataSet(); myCommand.Fill(oldds, "Table1"); //for (int i = 0; i < oldds.Tables[0].Rows.Count; i++) //{ // //在这里不能使用ImportRow方法将一行导入到news中,因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added // DataRow nrow = newds.Tables["Table1"].NewRow(); // for (int j = 0; j < newds.Tables[0].Columns.Count; j++) // { // nrow[j] = oldds.Tables[0].Rows[i][j]; // } // newds.Tables["Table1"].Rows.Add(nrow); //} myCommand.Update(oldds, "Table1"); myConn.Close(); } public static void CreateExcelFile(string FileName, List<string[]> uu) { if (FileName.Split('.')[FileName.Split('.').Length - 1] == "xlsx")//如果是2007版以后 { //create object Nothing = System.Reflection.Missing.Value; var app = new Microsoft.Office.Interop.Excel.Application(); app.Visible = false; Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Add(Nothing); Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[1]; worksheet.Name = "Sheet1"; //headline //int i = 1; //for (int i = 0; i < uu.Length; i++) //{ // worksheet.Cells[RowNum + 1, i + 1] = uu[i]; //} worksheet.Cells[1, 1] = "存档编号"; worksheet.Cells[1, 2] = "任务描述"; worksheet.Cells[1, 3] = "具体位置"; worksheet.Cells[1, 4] = "开始时间"; worksheet.Cells[1, 5] = "结束时间"; worksheet.Cells[1, 6] = "工作情况"; worksheet.Cells[1, 7] = "名称1"; worksheet.Cells[1, 8] = "型号1"; worksheet.Cells[1, 9] = "数量1"; worksheet.Cells[1, 10] = "名称2"; worksheet.Cells[1, 11] = "型号2"; worksheet.Cells[1, 12] = "数量2"; worksheet.Cells[1, 13] = "名称3"; worksheet.Cells[1, 14] = "型号3"; worksheet.Cells[1, 15] = "数量3"; worksheet.Cells[1, 16] = "名称4"; worksheet.Cells[1, 17] = "型号4"; worksheet.Cells[1, 18] = "数量4"; for (int i = 0; i < uu.Count; i++) { for (int j = 0; j < uu[i].Length; j++) { worksheet.Cells[i + 2, j + 1] = uu[i][j]; } } //foreach (UUser uu in luu) //{ // worksheet.Cells[1, i] = uu.name; // i++; //} worksheet.SaveAs(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing); workBook.Close(false, Type.Missing, Type.Missing); app.Quit(); } //else //{ // HSSFWorkbook wk = new HSSFWorkbook(); //创建一个名称为mySheet的表 // ISheet tb = wk.CreateSheet("Sheet1"); // //创建一行,此行为第二行 // IRow row = tb.CreateRow(1); // for (int i = 0; i < luu.Count; i++) // { // ICell cell = row.CreateCell(i); //在第二行中创建单元格 // cell.SetCellValue(luu[i].name);//循环往第二行的单元格中添加数据 } // using (FileStream fs = File.OpenWrite(FileName)) // { // wk.Write(fs); //向打开的这个xls文件中写入mySheet表并保存。 // } // } //} } } }