Excel生成DataTable DataTable转Excel
DataTable数据与Excel表格的相互转换
DataTable数据与Excel表格的相互转换using Excel = Microsoft.Office.Interop.Excel;private static Excel.Application m_xlApp = null;/// <summary>/// 将DataTable数据导出到Excel表/// </summary>/// <param name="tmpDataTable">要导出的DataTable</param>public static void ExportExcel(System.Data.DataTable tmpDataTable){if (tmpDataTable == null){return;}long rowNum = tmpDataTable.Rows.Count;//⾏数int columnNum = tmpDataTable.Columns.Count;//列数Excel.Application m_xlApp = new Excel.Application();m_xlApp.DisplayAlerts = false;//不显⽰更改提⽰m_xlApp.Visible = false;string saveFileName = "";SaveFileDialog saveDialog = new SaveFileDialog();saveDialog.DefaultExt = "xls";saveDialog.Filter = "Excel ⽂件|*.xls";saveDialog.FileName = "Sheet1";saveDialog.ShowDialog();saveFileName = saveDialog.FileName;if (saveFileName.IndexOf(":") < 0){return; //被点了取消} Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("⽆法创建Excel对象,可能您的机⼦未安装Excel", "系统提⽰", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}Excel.Workbooks workbooks = m_xlApp.Workbooks;Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1try{if (rowNum > 65536)//单张Excel表格最⼤⾏数{long pageRows = 65535;//定义每页显⽰的⾏数,⾏数必须⼩于65536int scount = (int)(rowNum / pageRows);//导出数据⽣成的表单数if (scount * pageRows < rowNum)//当总⾏数不被pageRows整除时,经过四舍五⼊可能页数不准{scount = scount + 1;}for (int sc = 1; sc <= scount; sc++){if (sc > 1){object missing = System.Reflection.Missing.Value;worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加⼀个sheet}else{worksheet = (Excel.Worksheet)workbook.Worksheets[sc];//取得sheet1}string[,] datas = new string[pageRows + 1, columnNum];for (int i = 0; i < columnNum; i++) //写⼊字段{datas[0, i] = tmpDataTable.Columns[i].Caption;//表头信息}Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);range.Interior.ColorIndex = 15;//15代表灰⾊range.Font.Bold = true;range.Font.Size = 9;int init = int.Parse(((sc - 1) * pageRows).ToString());int r = 0;int index = 0;int result;if (pageRows * sc >= rowNum){result = (int)rowNum;}else{result = int.Parse((pageRows * sc).ToString());}for (r = init; r < result; r++){index = index + 1;for (int i = 0; i < columnNum; i++){object obj = tmpDataTable.Rows[r][tmpDataTable.Columns[i].ToString()];datas[index, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防⽌⾃动转化格式 }System.Windows.Forms.Application.DoEvents();//添加进度条}Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[index + 1, columnNum]);fchR.Value2 = datas;worksheet.Columns.EntireColumn.AutoFit();//列宽⾃适应。
.netcore转exceldatatablelistt互转xlsx
.netcore转exceldatatablelistt互转xlsx using System;using System.Collections;using System.Collections.Generic;using ponentModel;using ponentModel.DataAnnotations;using ponentModel.DataAnnotations.Schema;using System.Data;using System.IO;using System.Linq;using System.Reflection;using pilerServices;using System.Threading.Tasks;using Castle.Core.Internal;using Microsoft.AspNetCore.Http;using erModel;using erModel;using erModel;using OfficeOpenXml;namespace Gaea.OfficeManagement{public static class ExcelHelper{public static DataTable ExcelToTable (Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex){ExcelPackage package = new ExcelPackage(ExcelFileStream);ExcelPackage.LicenseContext = mercial;ExcelWorksheet worksheet = package.Workbook.Worksheets[SheetIndex];//选定指定页int rows = worksheet.Dimension.End.Row;//获取worksheet的列数int cols = worksheet.Dimension.End.Column;DataTable dt = new DataTable();DataRow dr = null;for (int i = HeaderRowIndex; i <= rows; i++){if (i > 1)dr = dt.Rows.Add();for (int j = 1; j <= cols; j++){//默认将第⼀⾏设置为datatable的标题if (i == HeaderRowIndex)dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));//剩下的写⼊datatableelsedr[j - 1] = GetString(worksheet.Cells[i, j].Value);}}return dt;}private static string GetString(object obj){try{return obj.ToString();}catch (Exception ex){return "";}}/// <summary>/// 将excel转换为datatable/// </summary>/// <param name="filePaht">⽂件路径</param>/// <param name="startRow">读取数据的起始⾏</param>/// <returns>DataTable</returns>public static DataTable ExcelToDataTable(IFormFile file, int startRow){MemoryStream ms = new MemoryStream();file.CopyTo(ms);ms.Seek(0, SeekOrigin.Begin);//声明⼀个变量ISheet sheet = null;DataTable data = new DataTable();//int startRow = 3;try{//读取excel⽂件//FileStream fs = new FileStream(filePaht, FileMode.Open, FileAccess.Read);IWorkbook workbook = new XSSFWorkbook(ms);//读取excel的第⼀个sheet页sheet = workbook.GetSheetAt(0);if (sheet != null){//起始⾏IRow firstRow = sheet.GetRow(startRow);int cellCount = stCellNum; //⼀⾏最后⼀个cell的编号即总的列数//循环添加列for (int i = firstRow.FirstCellNum; i < cellCount; ++i){//如果导⼊的是端午活动的⼿机号码if(startRow==1){firstRow.Cells[0].SetCellType(CellType.String);}//添加列DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);data.Columns.Add(column);}//最后⼀列的标号int rowCount = stRowNum;for (int i = startRow+1; i <= rowCount; ++i){IRow row = sheet.GetRow(i);if (row == null) continue; //没有数据的⾏默认是null //创建⾏DataRow dataRow = data.NewRow();int index = 0;for (int j = row.FirstCellNum; j < cellCount; ++j){//填充列dataRow[index] = row.GetCell(j)?.ToString();index++;}//填充⾏data.Rows.Add(dataRow);}}return data;}catch (Exception ex){Console.WriteLine("Exception: " + ex.Message);return null;}}public static async Task<MemoryStream> ExportAsync(this DataTable table){var stream = new MemoryStream();//如果您在⾮商业环境中使⽤EPPlus//根据Polyform⾮商业许可证:ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;using (ExcelPackage package = new ExcelPackage()){// add a new worksheet to the empty workbookExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");//First add the headersfor (int i = 1; i <= table.Columns.Count; i++){worksheet.Cells[1, i].Value = $"{(table.Columns[i - 1].Caption.IsNullOrWhiteSpace() ? table.Columns[i - 1].ColumnName : table.Columns[i - 1].Caption)}"; worksheet.Cells[1, i].Style.Font.Bold = true;}//worksheet.Cells[1, 1].Value = "ID";//worksheet.Cells[1, 2].Value = "Name";//worksheet.Cells[1, 3].Value = "Gender";//worksheet.Cells[1, 4].Value = "Salary (in $)";for (int i = 2; i <= table.Rows.Count; i++){for (int j = 1; j <= table.Columns.Count; j++){worksheet.Cells[i, j].Value = $"{table.Rows[i - 2][j - 1]}";}}////Add values//worksheet.Cells["A2"].Value = 1000;//worksheet.Cells["B2"].Value = "Jon";//worksheet.Cells["C2"].Value = "M";//worksheet.Cells["D2"].Value = 5000;//worksheet.Cells["A3"].Value = 1001;//worksheet.Cells["B3"].Value = "Graham";//worksheet.Cells["C3"].Value = "M";//worksheet.Cells["D3"].Value = 10000;//worksheet.Cells["A4"].Value = 1002;//worksheet.Cells["B4"].Value = "Jenny";//worksheet.Cells["C4"].Value = "F";//worksheet.Cells["D4"].Value = 5000;//package.Save(); //Save the workbook.await package.SaveAsAsync(stream);stream.Seek(0, SeekOrigin.Begin);//没这句话就格式错return stream;}}public static DataTable ToDataTable<T>(this IEnumerable<T> collection){var props = typeof(T).GetProperties();var dt = new DataTable();dt.Columns.AddRange(props.Select(p =>{var col = new DataColumn(, p.PropertyType);var attrdisplay = p.GetAttributes<DisplayAttribute>().FirstOrDefault();if (attrdisplay != default){if (!string.IsNullOrWhiteSpace()){col.Caption = ;}elseif (!string.IsNullOrWhiteSpace(attrdisplay.ShortName)){col.Caption = $"{attrdisplay.ShortName}";}else if (!string.IsNullOrWhiteSpace(attrdisplay.Description)){col.Caption = attrdisplay.Description;}}var attrdisplayname = p.GetAttributes<DisplayNameAttribute>().FirstOrDefault();if (attrdisplayname != default && !string.IsNullOrWhiteSpace(attrdisplayname.DisplayName)) {col.Caption = $"{attrdisplayname.DisplayName}";}var attrdesc = p.GetAttributes<DescriptionAttribute>().FirstOrDefault();if (attrdesc != default && !string.IsNullOrWhiteSpace(attrdesc.Description)){col.Caption = $"{attrdesc.Description}";}var attrcol = p.GetAttributes<ColumnAttribute>().FirstOrDefault();if (attrcol != default && !string.IsNullOrWhiteSpace()){col.Caption = $"{}";}return col;}).ToArray());if (collection.Count() > 0){for (int i = 0; i < collection.Count(); i++){ArrayList tempList = new ArrayList();foreach (PropertyInfo pi in props){object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj);}object[] array = tempList.ToArray();dt.LoadDataRow(array, true);}}return dt;}}}。
如何在Excel中使用DataTable进行数据表分析
如何在Excel中使用DataTable进行数据表分析在Excel中使用DataTable进行数据表分析Excel是一款功能强大的电子表格软件,广泛应用于数据分析和处理领域。
作为Excel的一个重要功能,DataTable可以帮助用户更有效地进行数据表分析。
本文将介绍如何在Excel中使用DataTable进行数据表分析的步骤和技巧。
1. 创建DataTable在Excel中,可以通过多种方式创建一个DataTable。
一种常见的方式是直接从已有的数据表中创建DataTable。
在Excel中选择所需的数据范围,点击“插入”选项卡中的“表格”按钮,Excel将自动识别选中的数据范围并创建一个DataTable。
2. 数据筛选与排序使用DataTable可以轻松进行数据筛选和排序。
在数据表的标题行上点击鼠标右键,选择“筛选”菜单,即可打开筛选功能。
用户可以根据需要选择筛选的条件,Excel将根据条件自动筛选出符合条件的数据。
此外,还可以通过点击标题行的排序图标,对数据进行升序或降序排列。
3. 数据透视表Excel中的数据透视表可以帮助用户更加直观地理解和分析数据表中的信息。
在创建DataTable后,点击“插入”选项卡中的“数据透视表”按钮,选择所需的数据和汇总方式,Excel将自动生成一个数据透视表。
用户可以根据需要灵活调整数据透视表的布局和样式,以获取更清晰的数据分析结果。
4. 条件格式条件格式是Excel的一个重要功能,可以通过设置不同的条件,自动对数据表中的数据进行格式化。
使用DataTable进行数据表分析时,可以基于数据表中的数值大小、数值范围、文本内容等设置条件格式,以便更好地显示和分析数据。
在Excel中选择所需的数据范围,点击“开始”选项卡中的“条件格式”按钮,选择适合的条件格式。
5. 公式计算Excel中的公式计算功能可以对数据表中的数据进行复杂的计算和分析。
使用DataTable进行数据表分析时,可以根据具体需求,在数据表中添加各种公式,以实现不同的数据计算和分析。
C#Excel数据转化为Datatable
C#Excel数据转化为Datatable最近做项⽬,遇到了处理Excel的问题,要求以Excel为数据源,直接将Excel的数据在dataGridView中显⽰,主要是分三步进⾏。
第⼀:创建Excel⽂件的连接;第⼆:将Excel数据放⼊datatable;第三:绑定数据。
//创建Excel⽂件的连接,返回连接字符串private string GetStr(){string connectionString = string.Empty; OpenFileDialog f = new OpenFileDialog();f.ShowDialog();if (f.FileName != ""){if (lookUpEdit1.EditValue.ToString() == "2003")//Excel版本不⼀样,连接字符串也是不⼀样的{ //Excel2003connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + f.FileName + ";" + "Extended Properties=Excel 8.0 ;" }else{ //excel2007、2010connectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=NO;IMEX=1""", f.FileName);}}return connectionString;}private void Btn_导⼊_Click(object sender, EventArgs e){if (gridResult == null) return;// gridResult.Init(bga.db);gridResult.CurrentDataSet.Tables[0].Clear();//清空数据DataTable dt_result=gridResult.CurrentDataSet.Tables[0].Clone();OleDbConnection conn = null;DataTable dt = new DataTable();string connectionString = string.Empty;string filepath = GetStr();string strSheetName = "";if (filepath != "" || filepath.Length > 0){try{conn = new OleDbConnection(filepath);conn.Open();System.Data.DataTable dtTemp = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); strSheetName = dtTemp.Rows[0][2].ToString().Trim();//获取⼯作薄的nameOleDbDataAdapter oada = new OleDbDataAdapter("select * from [" + strSheetName + "]", conn); //根据⼯作薄的名字查找对应⼯作薄的数据oada.Fill(dt);conn.Close();gridResult.DataSource = dt;gridResult.Refresh();gridResult.CurrentDataSet.Tables[0] = dt;XControl.bga_grid.gridResult = null;this.Dispose();//释放资源this.Close();}catch (Exception ex){XtraMessageBox.Show(ex.Message+" 请重新选择Excel版本");return;}}}。
数据导出到Excel(或Word)源代码大全
数据导出到Excel(或Word)源代码大全在日常工作中,大家都习惯Office作为办公软件,因此,在开发软件的时,常常会有把数据导出到Excel等Office软件的需求。
在此,收集一些常用的导出文件的源程序,希望给大家带来方便。
(不断更新)一、DataSet数据集内数据转化为Excel1.// 作用:把DataSet数据集内数据转化为Excel、Word文件2.// 描述:这些关于Excel、Word的导出方法,基本可以实现日常须要,其中有些方法可以把数据导出后3.// 生成Xml格式,再导入数据库!有些屏蔽内容没有去掉,保留下来方便学习参考用之。
4.// 备注:请引用Office相应COM组件,导出Excel对象的一个方法要调用其中的一些方法和属性。
5.public void DataSetToExcel(DataSet ds,string FileName)6.{7.try8.{9.//Web页面定义10. //System.Web.UI.Page mypage=new System.Web.UI.Page();11.12. HttpResponse resp;13. resp=HttpContext.Current.Response;14. resp.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");15. resp.AppendHeader("Content-disposition","attachment;filename="+FileName+".xls");16. resp.ContentType="application/ms-excel";17.18. //变量定义19. string colHeaders=null;20. string Is_item=null;21.22. //显示格式定义////////////////23.24.25. //文件流操作定义26. //FileStream fs=new FileStream(FileName,FileMode.Create,FileAccess.Write);27. //StreamWriter sw=new StreamWriter(fs,System.Text.Encoding.GetEncoding("GB2312"));28.29. StringWriter sfw=new StringWriter();30. //定义表对象与行对象,同时用DataSet对其值进行初始化31. System.Data.DataTable dt=ds.Tables[0];32. DataRow[] myRow=dt.Select();33. int i=0;34. int cl=dt.Columns.Count;35.36. //取得数据表各列标题,各标题之间以/t分割,最后一个列标题后加回车符37. for(i=0;i<cl;i++)38. {39. //if(i==(cl-1)) //最后一列,加/n40. // colHeaders+=dt.Columns[i].Caption.ToString();41. //else42. colHeaders+=dt.Columns[i].Caption.ToString()+"/t";43. }44. sfw.WriteLine(colHeaders);45. //sw.WriteLine(colHeaders);46.47. //逐行处理数据48. foreach(DataRow row in myRow)49. {50. //当前数据写入51. for(i=0;i<cl;i++)52. {53. //if(i==(cl-1))54. // Is_item+=row[i].ToString()+"/n";55. //else56. Is_item+=row[i].ToString()+"/t";57. }58. sfw.WriteLine(Is_item);59. //sw.WriteLine(Is_item);60. Is_item=null;61. }62. resp.Write(sfw);63. //resp.Clear();64. resp.End();65. }66. catch(Exception e)67. {68. throw e;69. }70.}二、DataSet数据集内数据转化为Excel文件(2)1./// <summary>2./// ExportFiles 的摘要说明。
C#中datatable导出excel(三种方法)
C#中datatable导出excel(三种⽅法)⽅法⼀:(拷贝直接可以使⽤,适合⼤批量资料, 上万笔)Microsoft.Office.Interop.Excel.Application appexcel = new Microsoft.Office.Interop.Excel.Application();SaveFileDialog savefiledialog = new SaveFileDialog();System.Reflection.Missing miss = System.Reflection.Missing.Value;appexcel = new Microsoft.Office.Interop.Excel.Application();Microsoft.Office.Interop.Excel.Workbook workbookdata;Microsoft.Office.Interop.Excel.Worksheet worksheetdata;Microsoft.Office.Interop.Excel.Range rangedata;//设置对象不可见appexcel.Visible = false;System.Globalization.CultureInfo currentci = System.Threading.Thread.CurrentThread.CurrentCulture;System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us"); workbookdata = appexcel.Workbooks.Add(miss);worksheetdata = (Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets.Add(miss, miss, miss, miss);//给⼯作表赋名称 = "saved";for (int i = 0; i < dt.Columns.Count; i++){worksheetdata.Cells[1, i + 1] = dt.Columns[i].ColumnName.ToString();}//因为第⼀⾏已经写了表头,所以所有数据都应该从a2开始rangedata = worksheetdata.get_Range("a2", miss);Microsoft.Office.Interop.Excel.Range xlrang = null;//irowcount为实际⾏数,最⼤⾏int irowcount = dt.Rows.Count;int iparstedrow = 0, icurrsize = 0;//ieachsize为每次写⾏的数值,可以⾃⼰设置int ieachsize = 1000;//icolumnaccount为实际列数,最⼤列数int icolumnaccount = dt.Columns.Count;//在内存中声明⼀个ieachsize×icolumnaccount的数组,ieachsize是每次最⼤存储的⾏数,icolumnaccount就是存储的实际列数object[,] objval = new object[ieachsize, icolumnaccount];icurrsize = ieachsize;while (iparstedrow < irowcount){if ((irowcount - iparstedrow) < ieachsize)icurrsize = irowcount - iparstedrow;//⽤for循环给数组赋值for (int i = 0; i < icurrsize; i++){for (int j = 0; j < icolumnaccount; j++)objval[i, j] = dt.Rows[i + iparstedrow][j].ToString();System.Windows.Forms.Application.DoEvents();}string X = "A" + ((int)(iparstedrow + 2)).ToString();string col = "";if (icolumnaccount <= 26){col = ((char)('A' + icolumnaccount - 1)).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();}else{col = ((char)('A' + (icolumnaccount / 26 - 1))).ToString() + ((char)('A' + (icolumnaccount % 26 - 1))).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();}xlrang = worksheetdata.get_Range(X, col);// 调⽤range的value2属性,把内存中的值赋给excelxlrang.Value2 = objval;iparstedrow = iparstedrow + icurrsize;}//保存⼯作表System.Runtime.InteropServices.Marshal.ReleaseComObject(xlrang);xlrang = null;//调⽤⽅法关闭excel进程appexcel.Visible = true;⽅法⼆:(⾃⼰建函数,适合⼤批量资料, 上万笔)using System.IO;private void dataTableToCsv(DataTable table, string file){string title = "";FileStream fs = new FileStream(file, FileMode.OpenOrCreate);//FileStream fs1 = File.Open(file, FileMode.Open, FileAccess.Read);StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default); for (int i = 0; i < table.Columns.Count; i++){title += table.Columns[i].ColumnName + "\t"; //栏位:⾃动跳到下⼀单元格}title = title.Substring(0, title.Length - 1) + "\n";sw.Write(title);foreach (DataRow row in table.Rows){string line = "";for (int i = 0; i < table.Columns.Count; i++){line += row[i].ToString().Trim() + "\t"; //内容:⾃动跳到下⼀单元格}line = line.Substring(0, line.Length - 1) + "\n";sw.Write(line);}sw.Close();fs.Close();}dataTableToCsv(dt, @"c:\1.xls"); //调⽤函数System.Diagnostics.Process.Start(@"c:\1.xls"); //打开excel⽂件⽅法三:(可以⾃⼰调整单元格的格式,适合⼩批量的数量)//没有数据的话就不往下执⾏if (dataGridView1.Rows.Count == 0)return;//实例化⼀个Excel.Application对象Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//让后台执⾏设置为不可见,为true的话会看到打开⼀个Excel,然后数据在往⾥写//excel.Visible = false;excel.Visible = true;//新增加⼀个⼯作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错 excel.Application.Workbooks.Add(true);//⽣成Excel中列头名称for (int i = 0; i < dataGridView1.Columns.Count; i++){excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;}//把DataGridView当前页的数据保存在Excel中for (int i = 0; i < dataGridView1.Rows.Count - 1; i++){for (int j = 0; j < dataGridView1.Columns.Count; j++){if (dataGridView1[j, i].ValueType == typeof(string)){excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();}else{excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();}}}//设置禁⽌弹出保存和覆盖的询问提⽰框excel.DisplayAlerts = false;excel.AlertBeforeOverwriting = false;////保存⼯作簿//excel.Application.Workbooks.Add(true).Save();////保存excel⽂件//excel.Save("D:" + "\\KKHMD.xls");////确保Excel进程关闭//excel.Quit(); //可以直接打开⽂件//excel = null;}catch (Exception ex){MessageBox.Show(ex.Message, "错误提⽰");}Excel.output((DataTable)dataGridView1.DataSource);。
如何在Excel中使用DataTable进行数据表分析分析
如何在Excel中使用DataTable进行数据表分析分析Excel是广泛使用的电子表格软件,可以轻松处理和分析大量数据。
在Excel中,使用DataTable是一种强大的功能,可以帮助我们更有效地分析数据表。
本文将介绍如何在Excel中使用DataTable进行数据表分析。
一、什么是DataTableDataTable是Excel中的一种数据结构,类似于数据库中的表格。
它由行和列组成,每个单元格都可以存储数据。
通过使用DataTable,我们可以轻松地对数据进行排序、过滤和计算等操作。
二、创建DataTable在Excel中创建DataTable非常简单。
首先,打开Excel并新建一个工作表。
然后,在工作表中选择一列作为数据表的列名。
接下来,将数据逐行输入到相应的列中。
最后,选择数据表的范围,包括列名和数据,然后点击“插入”选项卡中的“表格”按钮。
Excel会自动将选择的范围转换为DataTable。
三、对DataTable进行排序排序是数据分析中常用的操作之一。
在Excel中,可以使用DataTable的排序功能对数据进行排序。
首先,选择要排序的列,可以选择多个列进行排序。
然后,点击“数据”选项卡中的“排序”按钮。
在弹出的排序对话框中,选择要排序的列和排序的顺序,点击“确定”按钮即可完成排序操作。
四、对DataTable进行筛选筛选是数据分析中另一个重要的操作。
在Excel中,可以使用DataTable的筛选功能对数据进行筛选。
首先,选择要筛选的列,然后点击“数据”选项卡中的“筛选”按钮。
在列标题中会出现筛选箭头,点击箭头可以选择要显示的数据。
还可以使用高级筛选功能,根据多个条件对数据进行筛选。
五、使用公式计算DataTable在Excel中,可以使用公式对数据进行计算。
同样地,在DataTable 中也可以使用公式计算数据。
选择需要进行计算的单元格,并在输入栏中输入相应的公式。
例如,可以使用SUM函数计算某一列的总和,使用AVERAGE函数计算某一列的平均值。
将数据转化为表格的方法
将数据转化为表格的方法将数据转化为表格的方法方法一:使用纯文本方式•在纯文本编辑器中创建一份数据,按照逗号或制表符分隔每个单元格的内容;•使用制表符或空格对齐每行的单元格内容;•在每行末尾添加换行符;•将文本保存为以.csv或.tsv为扩展名的文件;•使用支持表格格式的应用程序(如Excel、Google Sheets等)打开文件即可将文本转化为表格。
方法二:使用Excel软件1.打开Excel软件,并创建一个新的工作簿;2.将数据以行或列的方式输入到相应的单元格中;3.选中数据区域;4.点击Excel菜单栏上的“插入”选项,选择“表格”;5.在弹出的对话框中确认选择区域的正确性,点击“确定”按钮;6.Excel会将选中的数据自动转化为表格。
方法三:使用Google Sheets网页应用1.打开浏览器,并访问Google Sheets网页应用;2.创建一个新的空白工作表;3.在工作表中输入或粘贴数据;4.选择数据区域;5.点击工具栏上的“格式”选项,选择“表格”;6.在下拉菜单中选择“自动调整列宽”或手动调整列宽;7.Google Sheets会将选中的数据转化为表格。
方法四:使用Python编程语言1.安装Python编程环境;2.使用Python的pandas库导入数据文件(如.csv文件);3.调用pandas库的相关函数,将数据转化为表格形式;4.使用pandas库提供的其他功能,对表格进行操作和处理;5.调用pandas库的保存函数,将表格保存为.csv或.xlsx文件。
方法五:使用在线工具转换1.在搜索引擎中搜索“在线数据转表格工具”;2.选择一个可信赖且功能强大的在线工具网站;3.根据网站提供的指引,上传或输入数据;4.选择合适的表格格式和设置选项;5.点击“转换”按钮或类似的操作,将数据转为表格;6.下载生成的表格文件或复制表格内容。
以上是将数据转化为表格的几种常用方法,每种方法都适用于不同的使用场景和需求。
Excel 转Datatable
笔记-Excel转DataTable的NPOI简单范例这篇主要是写给自己备忘的,以下为使用NPOI读取表格Excel文件,自动转成DataTable的简单范例: (NPOI是什? 可参考旧文)using System.Data;using System.IO;using erModel;using erModel;public class NPOIHelper{public static DataTable ReadExcelAsTableNOPI(string fileName){using (FileStream fs = new FileStream(fileName, FileMode.Open)) {HSSFWorkbook wb = new HSSFWorkbook(fs);Sheet sheet = wb.GetSheetAt(0);DataTable table = new DataTable();//由第一列取标题做为字段名称Row headerRow = sheet.GetRow(0);int cellCount = stCellNum;for (int i = headerRow.FirstCellNum; i < cellCount; i++) //以字段文字为名新增字段,此处全视为字符串型别以求简化 table.Columns.Add(newDataColumn(headerRow.GetCell(i).StringCellValue));//略过第零列(标题列),一直处理至最后一列for (int i = (sheet.FirstRowNum + 1); i < stRowNum; i++){Row row = sheet.GetRow(i);if (row == null) continue;DataRow dataRow = table.NewRow();//依先前取得的字段数逐一设定字段内容for (int j = row.FirstCellNum; j < cellCount; j++)if (row.GetCell(j) != null)//如要针对不同型别做个别处理,可善用.CellType 判断型别//再用.StringCellValue, .DateCellValue, .NumericCellValue...取值//此处只简单转成字符串dataRow[j] = row.GetCell(j).ToString();table.Rows.Add(dataRow);}return table;}}}范例假设Excel第一列视为标题列,读取各字段值当成DataTable的Column名称,建立字段后,逐一读取各列的数据新增为Row,其中字段内容一律视为字符串处置。
DataGridView或DataTable导出为Excel-处理了数字字符串去掉前面0的问题-支持进度条
DataGridView或DataTable导出为Excel,处理了数字字符串的bug 使用说明://以前文档存在以下的Bug:数字字符串如部门编号001003将去掉前面的0变成1003.这是不合要求的。
//对以前上传的文档出现的bug表示抱歉,现更正过来,只需将代码//worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i];//修改为(共需修改2处)//worksheet.Cells[r + 2, i + 1] = “’” + dt.DefaultView[r][i].ToString();//加单引号为了表示单元格//一直是文本格式//编程语言:C# 主要用于Winforms应用程序的报表导出操作。
//使用时,请添加引用微软的Microsoft.Office.Interop.Excel组件//在以前的上传文档基础上增加两个重载方法,共四种参数的重载://重载方法1:ExportToExcel(System.Data.DataTable dt)//重载方法2:ExportToExcel(DataGridView dgv)//重载方法3:ExportToExcel(System.Data.DataTable dt, ProgressBar pb)//重载方法4:ExportToExcel(DataGridView dgv, ProgressBar pb)//最后两个重载方法支持进度条控件源代码如下:using System;using System.Collections.Generic;using System.Text;using Microsoft.Office.Interop.Excel;using System.Windows.Forms;namespace Channels{/// <summary>/// 静态方法ExportToExcel提供四种参数的重载/// DataGridView或DataTable导出到Excel,可以选择是否添加进度条来查看导出excel 进度加单引号”’”,则表示单元格一直是文本,如001003显示为001003,而不是1003 /// 需要使用进度条时,请在窗体中加入一个ProgressBar控件progressBar1,并设置progressBar1.Visible=false/// </summary>public class DataTableToExcel{/// <summary>/// 将DataGridView转化为DataTable/// </summary>/// <param name="dv"></param>/// <returns></returns>public static System.Data.DataTable dvtodt(DataGridView dv){System.Data.DataTable dt = new System.Data.DataTable();System.Data.DataColumn dc;for (int i = 0; i < dv.Columns.Count; i++){dc = new System.Data.DataColumn();dc.ColumnName = dv.Columns[i].HeaderText.ToString();dt.Columns.Add(dc);}for (int j = 0; j < dv.Rows.Count; j++){System.Data.DataRow dr = dt.NewRow();for (int x = 0; x < dv.Columns.Count; x++){dr[x] = dv.Rows[j].Cells[x].Value;}dt.Rows.Add(dr);}return dt;}/// <summary>/// 将DataGridView导出为Excel文件(.xls)/// </summary>/// <param name="dgv">要导出的DatGridView</param>public static void ExportToExcel(DataGridView dgv){//获得DataTableSystem.Data.DataTable dt = dvtodt(dgv);ExportToExcel(dt);}/// <summary>/// 将DataGridView导出为excel文件,导出过程中显示进度条/// </summary>/// <param name="dgv">要导出的DatGridView</param>/// <param name="pb">与dgv在同一窗体的ProgressBar控件,pb初始化时Visible=false</param>public static void ExportToExcel(DataGridView dgv, ProgressBar pb){//获得DataTableSystem.Data.DataTable dt = dvtodt(dgv);ExportToExcel(dt, pb);}/// <summary>/// 将DataTable导出为Excel文件(.xls)/// </summary>/// <param name="dt">要导出的DataTable</param>public static void ExportToExcel(System.Data.DataTable dt){if (dt == null) return;Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel");return;}System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog();saveDia.Filter = "Excel|*.xls";saveDia.Title = "导出为Excel文件";saveDia.FileName = string.Format("{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss"));if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK&& !string.Empty.Equals(saveDia.FileName)){Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1Microsoft.Office.Interop.Excel.Range range = null;long totalCount = dt.Rows.Count;long rowRead = 0;float percent = 0;string fileName = saveDia.FileName;//写入标题for (int i = 0; i < dt.Columns.Count; i++){worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];//range.Interior.ColorIndex = 15;//背景颜色range.Font.Bold = true;//粗体range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//居中//加边框range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous,Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin,Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);//range.ColumnWidth = 4.63;//设置列宽//range.EntireColumn.AutoFit();//自动调整列宽//r1.EntireRow.AutoFit();//自动调整行高}//写入内容for (int r = 0; r < dt.DefaultView.Count; r++){for (int i = 0; i < dt.Columns.Count; i++){//加单引号是为了显示的内容永远为文本,如00123返回00123//worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i];//这行代码的//00123返回123,不合要求worksheet.Cells[r + 2, i + 1] = "'" + dt.DefaultView[r][i].ToString();range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1];range.Font.Size = 9;//字体大小//加边框range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous,Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin,Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);range.EntireColumn.AutoFit();//自动调整列宽}rowRead++;percent = ((float)(100 * rowRead)) / totalCount;////进度条//pb.Maximum = (int)totalCount;//pb.Value = (int)rowRead;System.Windows.Forms.Application.DoEvents();}range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;if (dt.Columns.Count > 1){range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;}try{workbook.Saved = true;workbook.SaveCopyAs(fileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);return;}workbooks.Close();if (xlApp != null){xlApp.Workbooks.Close();xlApp.Quit();int generation = System.GC.GetGeneration(xlApp);System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);xlApp = null;System.GC.Collect(generation);}GC.Collect();//强行销毁#region 强行杀死最近打开的Excel进程System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");System.DateTime startTime = new DateTime();int m, killId = 0;for (m = 0; m < excelProc.Length; m++){if (startTime < excelProc[m].StartTime){startTime = excelProc[m].StartTime;killId = m;}}if (excelProc[killId].HasExited == false){excelProc[killId].Kill();}#endregionMessageBox.Show("导出成功!");}}/// <summary>/// 将DataTable导出为excel文件,导出过程中显示进度条/// </summary>/// <param name="dt">要导出的DataTable对象</param>/// <param name="pb">窗体中的ProgressBar控件,pb初始化时Visible=false</param>public static void ExportToExcel(System.Data.DataTable dt, ProgressBar pb){if (dt == null) return;Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();if (xlApp == null){MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel");return;}System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog();saveDia.Filter = "Excel|*.xls";saveDia.Title = "导出为Excel文件";saveDia.FileName = string.Format("{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss"));if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK&& !string.Empty.Equals(saveDia.FileName)){Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1Microsoft.Office.Interop.Excel.Range range = null;long totalCount = dt.Rows.Count;pb.Visible = true;//将进度条控件显示pb.Maximum = (int)totalCount;//设置进度条控件的最大值long rowRead = 0;float percent = 0;string fileName = saveDia.FileName;//写入标题for (int i = 0; i < dt.Columns.Count; i++){worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];//range.Interior.ColorIndex = 15;//背景颜色range.Font.Bold = true;//粗体range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//居中//加边框range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous,Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin,Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);//range.ColumnWidth = 4.63;//设置列宽//range.EntireColumn.AutoFit();//自动调整列宽//r1.EntireRow.AutoFit();//自动调整行高}//写入内容for (int r = 0; r < dt.DefaultView.Count; r++){for (int i = 0; i < dt.Columns.Count; i++){//worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i];没有使用"'",//则001003返回1003worksheet.Cells[r + 2, i + 1] = "'" + dt.DefaultView[r][i].ToString();//使用"'",001003返回001003range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1];range.Font.Size = 9;//字体大小//加边框range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous,Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin,Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);range.EntireColumn.AutoFit();//自动调整列宽}rowRead++;percent = ((float)(100 * rowRead)) / totalCount;//进度条控件需要用百分号表示进度时,使用该行代码pb.Value = (int)rowRead;//设置进度条控件的当前值System.Windows.Forms.Application.DoEvents();}range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;if (dt.Columns.Count > 1)range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;}try{workbook.Saved = true;workbook.SaveCopyAs(fileName);}catch (Exception ex){MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);return;}workbooks.Close();if (xlApp != null){xlApp.Workbooks.Close();xlApp.Quit();int generation = System.GC.GetGeneration(xlApp);System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);xlApp = null;System.GC.Collect(generation);}GC.Collect();//强行销毁#region 强行杀死最近打开的Excel进程System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");System.DateTime startTime = new DateTime();int m, killId = 0;for (m = 0; m < excelProc.Length; m++){if (startTime < excelProc[m].StartTime){startTime = excelProc[m].StartTime;killId = m;}}if (excelProc[killId].HasExited == false){excelProc[killId].Kill();#endregionpb.Visible = false;//再次将进度条隐藏MessageBox.Show("导出成功!");}}}}。
C#DataTable导出Excel,并实现合并单元格
C#DataTable导出Excel,并实现合并单元格 webwofrm后台代码----------建议Framework4.0及以上,3.5试过出现好多莫名错误...⾸先导⼊两个程序集。
我的是 office2003,引⽤的COM⾥⾯的 Microsoft.office.Interop.Excel 14.0 和程序集⾥的Microsoft Excel 12.0 Object Library。
有多个版本,根据⾃⼰的office版本选择。
添加之后引⽤⾥⼒会出现两个DLL Microsoft.office.Core 和Microsoft.office.Interop.Excel⽣成⼀下项⽬,如果出现 Excel.ApplicationClass()⽆法互嵌套操作类型请改⽤适⽤的接⼝把引⽤的Microsoft.Office.Interop.Excel 右击属性嵌⼊互操作类型改为false即可DataTable dt = new DataTable();DataColumn dc1 = new DataColumn();dc1.ColumnName = "name";dc1.DataType = typeof(string);DataColumn dc2 = new DataColumn();dc2.ColumnName = "age";dc2.DataType = typeof(int);dt.Columns.Add(dc1);dt.Columns.Add(dc2);for (int i = 0; i < 1000; i++){DataRow dr = dt.NewRow();dr[0] = "茂茂" + i + "号";dr[1] = i;dt.Rows.Add(dr);}new Class1().DataTabletoExcel(dt, DateTime.Now.Ticks+".xlsx");先造些数据,然后将datatable和要导出⽂件名传递给⽅法。
excel datatable用法
excel datatable用法
Excel中的数据表(DataTable)是用于存储和操作数据的一种结构。
它类似于数据库中的表,可以包含多个列和多个行。
在Excel中创建数据表的步骤如下:
1. 打开Excel并选择一个工作表。
2. 确定要在工作表中创建数据表的位置。
3. 在Excel菜单中选择“插入”,然后在“表格”下拉菜单中选择“表格”选项。
或者,您可以使用快捷键Ctrl + T来创建数据表。
4. 确保已选择正确的表格范围,并启用“将表格具体化为”选项。
选择“数据库”选项,然后单击“确定”。
5. 在打开的“创建表格”对话框中,确认已选择正确的数据范围和选项。
6. 单击“确定”按钮以创建数据表。
一旦创建了数据表,您可以使用以下方法来使用它:
1. 插入数据:在数据表中插入新的行或列,以增加数据。
2. 排序数据:根据特定的列中的值对数据进行排序。
3. 筛选数据:根据条件筛选数据,以显示满足条件的行。
4. 计算数据:使用内置的计算功能(如求和、平均值等)对数据进行计算。
5. 更新数据:对表中的数据进行更改或更新。
6. 删除数据:删除表中的行或列,以删除数据。
7. 格式化数据:调整数据的样式和格式,以使其易于阅读和理解。
总的来说,使用Excel数据表可以更方便地管理和操作大量的数据,提高数据处理和分析的效率。
Excel的DataTable功能的使用方法
Excel的DataTable功能的使用方法Excel是一款功能强大的电子表格软件,广泛应用于数据分析、报表制作、项目管理等领域。
其中的DataTable功能是Excel提供的一项重要功能,可以实现数据的整理、筛选、排序、汇总等操作。
本文将介绍Excel的DataTable功能的使用方法,帮助读者更好地使用Excel 处理数据。
一、创建DataTable使用DataTable功能前,首先需要创建一个DataTable对象。
可以通过以下步骤创建:1. 打开Excel,在工作表中选择一个空白单元格,输入表头信息(每一列的字段名),表头可以包括多个列。
2. 选中表头信息所在的单元格区域,点击Excel菜单栏中的“数据”选项,然后选择“DataTable”功能。
3. 在弹出的对话框中,选择“创建表”选项,点击确定。
4. Excel将会自动创建一个DataTable对象,该对象中包含了表头信息。
二、填充数据创建DataTable后,可以向该对象中填充数据。
可以通过以下方法进行填充:1. 在Excel中,选择DataTable对象下方的空白单元格区域,逐行输入数据。
每一行的数据需要与表头字段对应,确保数据的准确性。
2. 当输入完一行数据后,按下“Enter”键或者“Tab”键,Excel会自动跳转到下一行,继续输入数据。
3. 可以根据需要插入和删除行或列,调整DataTable的数据结构。
在Excel菜单栏的“编辑”选项中,选择“插入”或“删除”功能,进行相应的操作。
4. 数据填充完成后,点击Excel菜单栏中的“数据”选项,选择“重新创建表”功能,即可完成数据的更新。
三、筛选数据DataTable功能的一个重要应用是进行数据的筛选。
可以通过以下步骤进行筛选:1. 在DataTable对象中,点击Excel菜单栏中的“数据”选项,选择“筛选”功能。
2. 在弹出的筛选对话框中,可以选择一个或多个字段进行筛选。
C#DataTable行转列列转行同时转换
C#DataTable⾏转列列转⾏同时转换需求:数据库数据都是纵向的,呈现的时候要求是横向(列转⾏)同时看到⾏头(⾏转列)。
分析:很多报表呈现都要求要这样显⽰,⽤类是可以实现,但是代码多,⼜需要建很多dto。
发下Excel有转置功能,但⼜不想牵扯Excel这⼀套组件。
就使⽤DataTable来实现,代码也不多。
先看看⽰例数据3列10⾏:我们要把它转成3⾏10列,列转⾏,⾏转列同时完成:百度上有不少转换⽅案,都不尽如意。
基本都是⼀个⽅向的转换。
要么是⾏转列,要么是列转⾏。
⼲脆就⾃⼰写了⼀个。
因为⾏转列,列转⾏要同时进⾏,我们需要仔细观察数据,打个下标来观察。
先把数据归类为⼆维数组,从转换后的表倒推回去,发现:结果表的是【1,1】是原始表的【1,1】.结果表的【1,2】是原始表的【2,1】,类推结果表【1,3】是原始表【3,1】规律:下标对调就可以得到转换表代码实现:1、把源数据(包含列头)转换成⼆维数组,然后下标对调。
这种⽅法使⽤最⽅便。
就是要仔细算下标位置,应为列头加进去了private DataTable PivotDatatable(DataTable dtSource, string columnFilter){var columns = columnFilter.Split(',');DataTable dtFilter = dtSource.DefaultView.ToTable(false, columns);DataTable dtResult = new DataTable();var rowCount = dtFilter.Rows.Count;var columnCount = columns.Length;// 源数组的⾏数⽐DataTable的⾏数+1,, 加⼀⾏表头object[,] arrSource = new object[rowCount + 1, columnCount];// ⽬标数组的⾏数等于选择的列数,列数等于源数据的⾏数+1, 加⼀列属性名object[,] arrResult = new object[columnCount, rowCount + 1];// 原数组第⼀⾏写表头for (int i = 0; i < columnCount; i++){arrSource[0, i] = dtFilter.Columns[i].ColumnName;}// 源数据每⼀⾏写数据for (int i = 0; i < rowCount; i++){for (int j = 0; j < columnCount; j++){arrSource[i + 1, j] = dtFilter.Rows[i][j];}}// 原数转置到⽬标数组for (int i = 0; i < rowCount + 1; i++){for (int j = 0; j < columnCount; j++){arrResult[j, i] = arrSource[i, j];}}// 创建 Datatable 的结构for (int i = 0; i < rowCount + 1; i++){dtResult.Columns.Add(arrResult[0, i].ToString());}List<string> valueList = new List<string>();for (int i = 1; i < columnCount; i++){for (int j = 0; j < rowCount + 1; j++){valueList.Add(arrResult[i, j].ToString());}dtResult.Rows.Add(valueList.ToArray());valueList.Clear();}return dtResult;}2、思路是数据转换成⼆维码(不含列头),转换完成后,再把列头加⼊到新的table⾥⾯,不需要过多算下标private DataTable SwapTable(DataTable tableData){int intRows = tableData.Rows.Count;int intColumns = tableData.Columns.Count;//转⼆维数组string[,] arrayData = new string[intRows, intColumns];for (int i = 0; i < intRows; i++){for (int j = 0; j < intColumns; j++){arrayData[i, j] = tableData.Rows[i][j].ToString();}}//下标对换string[,] arrSwap = new string[intColumns, intRows];for (int m = 0; m < intColumns; m++){for (int n = 0; n < intRows; n++){arrSwap[m, n] = arrayData[n, m];}}DataTable dt = new DataTable();//添加列for (int k = 0; k < intRows; k++){dt.Columns.Add(new DataColumn(arrSwap[0, k]));}//添加⾏for (int r = 1; r < intColumns; r++){DataRow dr = dt.NewRow();for (int c = 0; c < intRows; c++){dr[c] = arrSwap[r, c].ToString();}dt.Rows.Add(dr);}//添加⾏头DataColumn ColRowHead = new DataColumn(tableData.Columns[0].ColumnName);dt.Columns.Add(ColRowHead);dt.Columns[ColRowHead.ColumnName].SetOrdinal(0);for (int i = 0; i < intColumns - 1; i++){dt.Rows[i][ColRowHead.ColumnName] = tableData.Columns[i + 1].ColumnName;}return dt;}。
excel中的数据区域转化方法
excel中的数据区域转化方法
在Excel中,可以使用以下方法将数据区域进行转化:
1. 转化为表格(Table):选中数据区域,点击"插入"选项卡中的"表格"按钮,选择"表格"或"快速分析工具"中的"表格"选项。
这将把选定的数据区域转化为一个带有列标题和筛选功能的表格。
2. 转化为命名区域(Named Range):选中数据区域,点击"公式"选项卡中的"定义名称"按钮,输入所需的名称,并点击"确定"。
现在,你可以使用该名称来引用整个数据区域,而不必每次都选择它。
3. 转化为数据透视表(Pivot Table):选中数据区域,点击"插入"选项卡中的"数据透视表"按钮,根据向导的指示选择所需的选项。
数据透视表能够对数据进行汇总和分析,并生成交互式报表。
4. 转化为图表(Chart):选中数据区域,点击"插入"选项卡中的"图表"按钮,选择所需的图表类型。
Excel将根据选定的数据区域自动创建相应的图表。
以上是几种常见的将数据区域转化的方法,根据你的具体需求选择适合的方法。
1。
excel表中所有sheet表中的某一单元格数据提取并生成新的表
要在Excel中提取所有工作表中的某一单元格数据并生成新的表,可以使用以下步骤:1. 打开Excel文件。
2. 按下`Alt + F11`键,打开VBA编辑器。
3. 点击菜单栏的`插入`,然后选择`模块`,在模块中输入以下代码:```vbaSub 提取数据()Dim ws As WorksheetDim newWs As WorksheetDim cellValue As VariantDim lastRow As LongDim lastCol As LongDim i As LongDim j As Long' 创建一个新的工作表用于存放提取的数据Set newWs = ThisWorkbook.Worksheets.Add = "提取数据"' 遍历所有工作表For Each ws In ThisWorkbook.Worksheets' 获取当前工作表的最后一行和最后一列lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).RowlastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column' 遍历当前工作表的所有单元格For i = 1 To lastRowFor j = 1 To lastCol' 提取指定单元格的数据(例如A1)cellValue = ws.Cells(i, j).Value' 将数据写入新工作表的对应位置(例如A1)newWs.Cells(newWs.Cells(newWs.Rows.Count, "A").End(xlUp).Row + 1, "A").Value = cellValueNext jNext iNext wsEnd Sub```4. 修改代码中的`cellValue = ws.Cells(i, j).Value`这一行,将`ws.Cells(i, j).Value`替换为需要提取的单元格地址,例如`ws.Cells(i, "B").Value`表示提取B列的数据。
C#实现DataTable转为Excel文件
C#实现DataTable转为Excel⽂件实现DataTable转为Excel⽂件,和上次分享的互为反操作。
DataTable转化为Excel⽂件是通过传⼊⼀个DataTable类型的参数,然后将传⼊的DataTable转化为Excel⽂件。
实现关键代码如下:public void ToExcel(DataTable dt){#region 3svar FilePath = @"D:\ToExcel\";//产⽣Excel⽂件路径DeleteFile(FilePath);//创建全新的Workbookvar workbook = new HSSFWorkbook();//⼀個sheet最多65536⾏var count = 0;for (double i = 0; i < Convert.ToDouble(dt.Rows.Count) / Convert.ToDouble(65534); i++)//每个Excel⽂件的⼀个页签只能存放65536⾏数据{var row_index = 0;//创建Sheetworkbook.CreateSheet("Sheet" + i);//根据Sheet名字获得Sheet对象var sheet = workbook.GetSheet("Sheet" + i);IRow row;row = sheet.CreateRow(row_index);//写⼊标题for (int j = 0; j < dt.Columns.Count; j++){row.CreateCell(j).SetCellValue(dt.Columns[j].Caption.ToString());}row = sheet.CreateRow(++row_index);//写⼊数据for (int j = 0; j < (dt.Rows.Count - count > 65534 ? 65534 : dt.Rows.Count - count); j++){var r = dt.Rows[j + count];for (int k = 0; k <dt.Columns.Count; k++){row.CreateCell(k).SetCellValue(r[k].ToString());//如果是数字,判断是否需要转换为数字//if (IsNumeric(r[k].ToString()))//{// row.CreateCell(k).SetCellValue(Convert.ToDouble(r[k].ToString()));//}//else//{// row.CreateCell(k).SetCellValue(r[k].ToString());//}}row = sheet.CreateRow(++row_index);}count += row_index - 2;}//保存Workbook⽅式⼀:以⽂件形式保存到服务器中(每次导出都会⽣成⼀个⽂件,慎重使⽤)var FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";var sw = File.Create(FilePath + FileName);workbook.Write(sw);sw.Close();var EC = new ExcelConverter();EC.WebopenExcel(Response, FilePath + FileName);#endregion}。
ExcelUtility类库操作说明(模板导出示例)
ExcelUtility类库操作说明(模板导出示例)设计/开发:左文俊/// <summary>/// 测试方法:测试依据模板+DataTable来生成EXCEL/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByDataTable(){DataTable dt = GetDataTable();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化一个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//实例化一个局部元素格式化器partFormatterBuilder.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//实例化一个单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前日期formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效//实例化一个表格格式化器,dt.Select()是将DataTable转换成DataRow[],name表示的模板表格中第一行第一个单元格要填充的数据参数名TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(dt.Select(), "name");tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"name",r=>r["Col1"]},//将模板表格中name对应DataTable中的列Col1{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:/// <summary>/// 测试方法:测试依据模板+List来生成EXCEL/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList(){List<Student> studentList = GetStudentList();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化一个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//实例化一个局部元素格式化器partFormatterBuilder.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//实例化一个单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前日期formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效//实例化一个表格格式化器,studentList本身就是可枚举的无需转换,name表示的模板表格中第一行第一个单元格要填充的数据参数名TableFormatterBuilder<Student> tableFormatterBuilder = new TableFormatterBuilder<Student>(studentList, "name");{"name",r=>},//将模板表格中name对应Student对象中的属性Name{"sex",r=>r.Sex},//将模板表格中sex对应Student对象中的属性Sex{"km",r=>r.KM},//将模板表格中km对应Student对象中的属性KM{"score",r=>r.Score},//将模板表格中score对应Student对象中的属性Score{"result",r=>r.Result}//将模板表格中result对应Student对象中的属性Result});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板同上一个模板导出结果如下:/// <summary>/// 测试方法:测试依据模板+DataTable来生成多表格EXCEL(注意:由于ExcelReport框架限制,目前仅支持模板文件格式为:xls)/// </summary>[TestMethod]public void TestExportToRepeaterExcelWithTemplateByDataTable(){DataTable dt = GetDataTable();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel2.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化一个模板数据格式化容器//实例化一个可重复表格格式化器,dt.Select()是将DataTable转换成DataRow[],rpt_begin表示的模板表格开始位置参数名,rpt_end表示的模板表格结束位置参数名RepeaterFormatterBuilder<DataRow> tableFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(dt.Select(), "rpt_begin", "rpt_end");{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});PartFormatterBuilder<DataRow> partFormatterBuilder2 = new PartFormatterBuilder<DataRow>();//实例化一个可嵌套的局部元素格式化器partFormatterBuilder2.AddFormatter("name", r => r["Col1"]);//将模板表格中name对应DataTable中的列Col1tableFormatterBuilder.AppendFormatterBuilder(partFormatterBuilder2);//添加到可重复表格格式化器中,作为其子格式化器CellFormatterBuilder<DataRow> cellFormatterBuilder = new CellFormatterBuilder<DataRow>();//实例化一个可嵌套的单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", r => DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前日期tableFormatterBuilder.AppendFormatterBuilder(cellFormatterBuilder);//添加到可重复表格格式化器中,作为其子格式化器formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "multtable", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:/// <summary>///测试方法:测试依据复杂模板(含固定表格,可重复表格)+DataTable来生成EXCEL (注意:由于ExcelReport框架限制,目前仅支持模板文件格式为:xls)/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList2(){var schoolLevelList = SchoolLevel.GetList();var classList = ClassInfo.GetList();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化一个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越小学");formatterContainers.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//实例化一个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>{{"lv",r=>r.LevelName}, //模板参数与数据源SchoolLevel属性对应关系,下同{"clscount",r=>r.ClassCount},{"lvmaster",r=>r.Master}});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效RepeaterFormatterBuilder<ClassInfo> repeaterFormatterBuilder = new RepeaterFormatterBuilder<ClassInfo>(classList, "lv_begin", "lv_end");//实例化一个可重复表格格式化器repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<ClassInfo, object>> {{"class",r=>r.ClassName}, //模板参数与数据源ClassInfo属性对应关系,下同{"stucount",r=>r.StudentCount},{"clsmaster",r=>r.Master},{"lvitem",r=>r.LevelName}});formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:/// <summary>/// 测试方法:测试依据复杂模板(含固定表格,可重复表格中嵌套表格)+DataTable来生成EXCEL (注意:由于ExcelReport框架限制,目前仅支持模板文件格式为:xls)/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList3(){var schoolLevelList = SchoolLevel.GetList();var classList = ClassInfo.GetListWithLevels();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb1.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化一个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越小学");formatterContainers.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//实例化一个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>{{"lv",r=>r.LevelName}, //模板参数与数据源SchoolLevel属性对应关系,下同{"clscount",r=>r.ClassCount},{"lvmaster",r=>r.Master}});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>> repeaterFormatterBuilder = new RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>>(classList, "lv_begin", "lv_end");repeaterFormatterBuilder.AddFormatter("lvitem",r=>r.Key);TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo> tableFormatterBuilder2=new TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo>(r=>r.Value,"class");tableFormatterBuilder2.AddFormatter("class",r=>r.ClassName);tableFormatterBuilder2.AddFormatter("stucount",r=>r.StudentCount);tableFormatterBuilder2.AddFormatter("clsmaster",r=>r.Master);repeaterFormatterBuilder.AppendFormatterBuilder(tableFormatterBuilder2);formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下: /// <summary>/// 测试方法:测试依据复杂模板(多工作薄,且含固定表格,可重复表格)+DataSet来生成EXCEL/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByDataSet(){var ds = GetDataSet();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb2.xls"; //获得EXCEL模板路径Dictionary<string, SheetFormatterContainer> formatterContainerDic = new Dictionary<string, SheetFormatterContainer>(); //实例化一个模板数据格式化容器数组,包含两个SheetFormatterContainer用于格式化两个工作薄#region 创建第一个工作薄格式化容器,并设置相关参数对应关系SheetFormatterContainer formatterContainer1 = new SheetFormatterContainer();PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越小学");formatterContainer1.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(ds.Tables[0].Select(), "lv");//实例化一个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"lv",r=>r["Col1"]}, //模板参数与数据源DataTable属性对应关系,下同{"clscount",r=>r["Col2"]},{"lvmaster",r=>r["Col3"]}});formatterContainer1.AppendFormatterBuilder(tableFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效RepeaterFormatterBuilder<DataRow> repeaterFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(ds.Tables[1].Select(), "lv_begin", "lv_end");//实例化一个可重复表格格式化器repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>> {{"class",r=>r["Col1"]}, //模板参数与数据源ClassInfo属性对应关系,下同{"stucount",r=>r["Col2"]},{"clsmaster",r=>r["Col3"]},{"lvitem",r=>r["Col4"]}});formatterContainer1.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到工作薄格式容器中,注意只有添加进去了才会生效formatterContainerDic.Add("table1", formatterContainer1);//添加到工作薄格式容器数组中,注意此处的Key值为模板上工作薄的名称,此处即为:table1#endregion#region 创建第二个工作薄格式化容器,并设置相关参数对应关系SheetFormatterContainer formatterContainer2 = new SheetFormatterContainer(); //实例化一个模板数据格式化容器PartFormatterBuilder partFormatterBuilder2 = new PartFormatterBuilder();//实例化一个局部元素格式化器partFormatterBuilder2.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainer2.AppendFormatterBuilder(partFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加进去了才会生效CellFormatterBuilder cellFormatterBuilder2 = new CellFormatterBuilder();//实例化一个单元格格式化器cellFormatterBuilder2.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前日期formatterContainer2.AppendFormatterBuilder(cellFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加进去了才会生效//实例化一个表格格式化器,dt.Select()是将DataTable转换成DataRow[],name表示的模板表格中第一行第一个单元格要填充的数据参数名TableFormatterBuilder<DataRow> tableFormatterBuilder2 = new TableFormatterBuilder<DataRow>(ds.Tables[2].Select(), "name"); tableFormatterBuilder2.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"name",r=>r["Col1"]},//将模板表格中name对应DataTable中的列Col1{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});formatterContainer2.AppendFormatterBuilder(tableFormatterBuilder2);//添加到工作薄格式容器中,注意只有添加进去了才会生效formatterContainerDic.Add("table2", formatterContainer2);//添加到工作薄格式容器数组中,注意此处的Key值为模板上工作薄的名称,此处即为:table2#endregionstring excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, formatterContainerDic);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:注意事项说明:1.模板文件格式建议以XLS为主,因为可重复表格导出方法若采用XLSX,则导出的数据存在问题;2.模板导出方法支持多种情况,可多种组合,灵活多变,基本可以满足所有的模板导出方法(图片动态生成除外),但上手相对也就复杂一些,故大家若在使用的时候有不明白的地方,可以联系我,谢谢!3.模板导出方法支持图片固定位置导出,但暂不支持透明图片浮动于文字上方,后面我会继续研究图片浮动解决方案。
分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUti。。。
分享我基于NPOI+ExcelReport实现的导⼊与导出EXCEL类库:ExcelUti。
⾃ExcelUtility类推出以来,经过项⽬中的实际使⽤与不断完善,现在⼜做了许多的优化并增加了许多的功能,本篇不再讲述原理,直接贴出⽰例代码以及相关的模板、结果图,以便⼤家快速掌握,另外这些⽰例说明我也已同步到GIT中,⼤家可以下载与学习,不⾜之处,敬请见谅,谢谢!⼀、ExcelUtility类库操作说明(模板导出⽰例)1./// <summary>/// 测试⽅法:测试依据模板+DataTable来⽣成EXCEL/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByDataTable(){DataTable dt = GetDataTable();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//实例化⼀个局部元素格式化器partFormatterBuilder.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//实例化⼀个单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前⽇期formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效//实例化⼀个表格格式化器,dt.Select()是将DataTable转换成DataRow[],name表⽰的模板表格中第⼀⾏第⼀个单元格要填充的数据参数名TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(dt.Select(), "name");tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"name",r=>r["Col1"]},//将模板表格中name对应DataTable中的列Col1{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:2./// <summary>/// 测试⽅法:测试依据模板+List来⽣成EXCEL/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList(){List<Student> studentList = GetStudentList();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xlsx"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//实例化⼀个局部元素格式化器partFormatterBuilder.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//实例化⼀个单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前⽇期formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效//实例化⼀个表格格式化器,studentList本⾝就是可枚举的⽆需转换,name表⽰的模板表格中第⼀⾏第⼀个单元格要填充的数据参数名TableFormatterBuilder<Student> tableFormatterBuilder = new TableFormatterBuilder<Student>(studentList, "name");tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<Student, object>>{{"name",r=>},//将模板表格中name对应Student对象中的属性Name{"sex",r=>r.Sex},//将模板表格中sex对应Student对象中的属性Sex{"km",r=>r.KM},//将模板表格中km对应Student对象中的属性KM{"score",r=>r.Score},//将模板表格中score对应Student对象中的属性Score{"result",r=>r.Result}//将模板表格中result对应Student对象中的属性Result});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板同上⼀个模板导出结果如下:3./// <summary>/// 测试⽅法:测试依据模板+DataTable来⽣成多表格EXCEL(注意:由于ExcelReport框架限制,⽬前仅⽀持模板⽂件格式为:xls)/// </summary>[TestMethod]public void TestExportToRepeaterExcelWithTemplateByDataTable(){DataTable dt = GetDataTable();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel2.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器//实例化⼀个可重复表格格式化器,dt.Select()是将DataTable转换成DataRow[],rpt_begin表⽰的模板表格开始位置参数名,rpt_end表⽰的模板表格结束位置参数名RepeaterFormatterBuilder<DataRow> tableFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(dt.Select(), "rpt_begin", "rpt_end");tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});PartFormatterBuilder<DataRow> partFormatterBuilder2 = new PartFormatterBuilder<DataRow>();//实例化⼀个可嵌套的局部元素格式化器partFormatterBuilder2.AddFormatter("name", r => r["Col1"]);//将模板表格中name对应DataTable中的列Col1tableFormatterBuilder.AppendFormatterBuilder(partFormatterBuilder2);//添加到可重复表格格式化器中,作为其⼦格式化器CellFormatterBuilder<DataRow> cellFormatterBuilder = new CellFormatterBuilder<DataRow>();//实例化⼀个可嵌套的单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", r => DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前⽇期tableFormatterBuilder.AppendFormatterBuilder(cellFormatterBuilder);//添加到可重复表格格式化器中,作为其⼦格式化器formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "multtable", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:4./// <summary>/// 测试⽅法:测试依据复杂模板(含固定表格,可重复表格)+DataTable来⽣成EXCEL (注意:由于ExcelReport框架限制,⽬前仅⽀持模板⽂件格式为:xls)/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList2(){var schoolLevelList = SchoolLevel.GetList();var classList = ClassInfo.GetList();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越⼩学");formatterContainers.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//实例化⼀个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>{{"lv",r=>r.LevelName}, //模板参数与数据源SchoolLevel属性对应关系,下同{"clscount",r=>r.ClassCount},{"lvmaster",r=>r.Master}});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效RepeaterFormatterBuilder<ClassInfo> repeaterFormatterBuilder = new RepeaterFormatterBuilder<ClassInfo>(classList, "lv_begin", "lv_end");//实例化⼀个可重复表格格式化器repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<ClassInfo, object>> {{"class",r=>r.ClassName}, //模板参数与数据源ClassInfo属性对应关系,下同{"stucount",r=>r.StudentCount},{"clsmaster",r=>r.Master},{"lvitem",r=>r.LevelName}});formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:5./// <summary>/// 测试⽅法:测试依据复杂模板(含固定表格,可重复表格中嵌套表格)+DataTable来⽣成EXCEL (注意:由于ExcelReport框架限制,⽬前仅⽀持模板⽂件格式为:xls)/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByList3(){var schoolLevelList = SchoolLevel.GetList();var classList = ClassInfo.GetListWithLevels();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb1.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越⼩学");formatterContainers.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<SchoolLevel> tableFormatterBuilder = new TableFormatterBuilder<SchoolLevel>(schoolLevelList, "lv");//实例化⼀个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<SchoolLevel, object>>{{"lv",r=>r.LevelName}, //模板参数与数据源SchoolLevel属性对应关系,下同{"clscount",r=>r.ClassCount},{"lvmaster",r=>r.Master}});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>> repeaterFormatterBuilder = new RepeaterFormatterBuilder<KeyValuePair<string, List<ClassInfo>>>(classList, "lv_begin", "lv_end"); repeaterFormatterBuilder.AddFormatter("lvitem",r=>r.Key);TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo> tableFormatterBuilder2=new TableFormatterBuilder<KeyValuePair<string, List<ClassInfo>>,ClassInfo>(r=>r.Value,"class"); tableFormatterBuilder2.AddFormatter("class",r=>r.ClassName);tableFormatterBuilder2.AddFormatter("stucount",r=>r.StudentCount);tableFormatterBuilder2.AddFormatter("clsmaster",r=>r.Master);repeaterFormatterBuilder.AppendFormatterBuilder(tableFormatterBuilder2);formatterContainers.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "school", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:6./// <summary>/// 测试⽅法:测试依据复杂模板(多⼯作薄,且含固定表格,可重复表格)+DataSet来⽣成EXCEL,只⽀持XLS/// </summary>[TestMethod]public void TestExportToExcelWithTemplateByDataSet(){var ds = GetDataSet();string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/mb2.xls"; //获得EXCEL模板路径Dictionary<string, SheetFormatterContainer> formatterContainerDic = new Dictionary<string, SheetFormatterContainer>(); //实例化⼀个模板数据格式化容器数组,包含两个SheetFormatterContainer⽤于格式化两个⼯作薄 #region 创建第⼀个⼯作薄格式化容器,并设置相关参数对应关系SheetFormatterContainer formatterContainer1 = new SheetFormatterContainer();PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();partFormatterBuilder.AddFormatter("school", "跨越⼩学");formatterContainer1.AppendFormatterBuilder(partFormatterBuilder);TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(ds.Tables[0].Select(), "lv");//实例化⼀个表格格式化器tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"lv",r=>r["Col1"]}, //模板参数与数据源DataTable属性对应关系,下同{"clscount",r=>r["Col2"]},{"lvmaster",r=>r["Col3"]}});formatterContainer1.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效RepeaterFormatterBuilder<DataRow> repeaterFormatterBuilder = new RepeaterFormatterBuilder<DataRow>(ds.Tables[1].Select(), "lv_begin", "lv_end");//实例化⼀个可重复表格格式化器repeaterFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>> {{"class",r=>r["Col1"]}, //模板参数与数据源ClassInfo属性对应关系,下同{"stucount",r=>r["Col2"]},{"clsmaster",r=>r["Col3"]},{"lvitem",r=>r["Col4"]}});formatterContainer1.AppendFormatterBuilder(repeaterFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效formatterContainerDic.Add("table1", formatterContainer1);//添加到⼯作薄格式容器数组中,注意此处的Key值为模板上⼯作薄的名称,此处即为:table1#endregion#region 创建第⼆个⼯作薄格式化容器,并设置相关参数对应关系SheetFormatterContainer formatterContainer2 = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder2 = new PartFormatterBuilder();//实例化⼀个局部元素格式化器partFormatterBuilder2.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员formatterContainer2.AppendFormatterBuilder(partFormatterBuilder2);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效CellFormatterBuilder cellFormatterBuilder2 = new CellFormatterBuilder();//实例化⼀个单元格格式化器cellFormatterBuilder2.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前⽇期formatterContainer2.AppendFormatterBuilder(cellFormatterBuilder2);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效//实例化⼀个表格格式化器,dt.Select()是将DataTable转换成DataRow[],name表⽰的模板表格中第⼀⾏第⼀个单元格要填充的数据参数名TableFormatterBuilder<DataRow> tableFormatterBuilder2 = new TableFormatterBuilder<DataRow>(ds.Tables[2].Select(), "name");tableFormatterBuilder2.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"name",r=>r["Col1"]},//将模板表格中name对应DataTable中的列Col1{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});formatterContainer2.AppendFormatterBuilder(tableFormatterBuilder2);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效formatterContainerDic.Add("table2", formatterContainer2);//添加到⼯作薄格式容器数组中,注意此处的Key值为模板上⼯作薄的名称,此处即为:table2#endregionstring excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, formatterContainerDic);Assert.IsTrue(File.Exists(excelPath));}模板如下:导出结果如下:⼆、ExcelUtility类库操作说明(嵌⼊图⽚⽰例)⼀、制作模板(含图⽚)1. 制作模板的⽂件格式需为兼容格式,即:xls或xlt;2. 模板变量(或称为占位符)定义与之前相同,即:$[变量名];3. 图⽚变量定义如下:a) 绘制⼀个图形,图形形状尽可能的与要显⽰的图⽚相同,⽐如:印章,则可绘制⼀个圆形;b) 图形必需是透明背景,边框可要可不要,建议留着,这样后续调整⽐较⽅便,如下图中的蓝⾊透明背景圆形:c) 图形⼤⼩尽可能与要显⽰的图⽚⼤⼩相同,如下图⽰:由于EXCEL上⼤⼩默认采⽤厘⽶,⽽图⽚⼀般采⽤像素,所以需要⾃⼰换算⼀下像素对应的厘⽶数(也可将EXCEL计算单位设为像素,⽅法⾃⾏⽹上查找);也可⽹上下载单位转换⼯具另外图形属性建议设置成如下图:温馨提⽰:图形形状、属性若未设置⼀般不影响导出效果,但不排除其它异常情况,图形⼤⼩是⼀定要设置,且尽可能与要显⽰图形⼤⼩(⾼、宽)相同,否则有可能造成导出变形代码⽰例:/// <summary>/// 测试⽅法:测试依据模板+DataTable+图⽚来⽣成包含图⽚的EXCEL,只⽀持XLS/// </summary>[TestMethod]public void TestInsertPic(){DataTable dt = GetDataTable();//获取数据string templateFilePath = AppDomain.CurrentDomain.BaseDirectory + "/excel.xls"; //获得EXCEL模板路径SheetFormatterContainer formatterContainers = new SheetFormatterContainer(); //实例化⼀个模板数据格式化容器PartFormatterBuilder partFormatterBuilder = new PartFormatterBuilder();//实例化⼀个局部元素格式化器partFormatterBuilder.AddFormatter("Title", "跨越IT学员");//将模板表格中Title的值设置为跨越IT学员dformatterContainers.AppendFormatterBuilder(partFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效CellFormatterBuilder cellFormatterBuilder = new CellFormatterBuilder();//实例化⼀个单元格格式化器cellFormatterBuilder.AddFormatter("rptdate", DateTime.Today.ToString("yyyy-MM-dd HH:mm"));//将模板表格中rptdate的值设置为当前⽇期formatterContainers.AppendFormatterBuilder(cellFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效//实例化⼀个表格格式化器,dt.Select()是将DataTable转换成DataRow[],name表⽰的模板表格中第⼀⾏第⼀个单元格要填充的数据参数名TableFormatterBuilder<DataRow> tableFormatterBuilder = new TableFormatterBuilder<DataRow>(dt.Select(), "name");tableFormatterBuilder.AddFormatters(new Dictionary<string, Func<DataRow, object>>{{"name",r=>r["Col1"]},//将模板表格中name对应DataTable中的列Col1{"sex",r=>r["Col2"]},//将模板表格中sex对应DataTable中的列Col2{"km",r=>r["Col3"]},//将模板表格中km对应DataTable中的列Col3{"score",r=>r["Col4"]},//将模板表格中score对应DataTable中的列Col4{"result",r=>r["Col5"]}//将模板表格中result对应DataTable中的列Co5});formatterContainers.AppendFormatterBuilder(tableFormatterBuilder);//添加到⼯作薄格式容器中,注意只有添加进去了才会⽣效string picPath = AppDomain.CurrentDomain.BaseDirectory + "\\tz.png";//图⽚路径PictureWithShapeFormatterBuilder pictureBuilder = new PictureWithShapeFormatterBuilder();//实例化⼀个图⽚关联图形格式化器//pictureBuilder.AddFormatter(picPath);//当sheet中只有⼀个图形时,我们可以省略指定区域,那么默认就是把整个⼯作薄区域当成⼀个寻找图形区域,若sheet中包含多个,则应指定区域,替换成如下语句pictureBuilder.AddFormatter(picPath,5,60000, 0, 3, false);//第⼀个参数为图⽚路径,中间4个参数为数字型指定图形寻找的⼯作薄区域(⾏索引,列索引,索引从0开始计),最后⼀个为是否⾃适应⼤⼩,⼀般不建议使⽤,除⾮压缩图⽚ formatterContainers.AppendFormatterBuilder(pictureBuilder);string excelPath = ExcelUtility.Export.ToExcelWithTemplate(templateFilePath, "table", formatterContainers);Assert.IsTrue(File.Exists(excelPath));}模板如下:注意图⽚若需要为透明背景格式,则必需使⽤PNG格式,NPOI⽀持的图⽚主要格式有:PNG,JPG导出结果如下:温馨提⽰:pictureBuilder.AddFormatter(picPath);//当sheet中只有⼀个图形时,我们可以省略指定区域,那么默认就是把整个⼯作薄区域当成⼀个寻找图形区域,若sheet中包含多个,则应指定区域,替换成如下语句pictureBuilder.AddFormatter(picPath,5,60000, 0, 3, false);//第⼀个参数为图⽚路径,中间4个参数为数字型指定图形寻找的⼯作薄区域(⾏索引(起⽌),列索引(起⽌),索引从0开始计),最后⼀个为是否⾃适应⼤⼩,⼀般不建议使⽤,除⾮压缩图⽚如果图形可能随单元格进⾏位置调整,那么在指定图形区域时需注意,如果图形会随单元格下移,那么结束⾏索引(MinRow)就需要指定⼀个可能的最⼤值或不指定,如果图形会随单元格右移,那么结束列索引(MinColumn)就需要指定⼀个可能的最⼤值或不指定,如果存在多个图形区域,则上述情况都必需给定具体值(可能的最⼤值),以免造成区域交叉,从⽽导致图⽚显⽰不正确,如下⽰例://图形可能下移,可能右移,那么将结束⾏设为可能最⼤值:60000,结束列设为可能最⼤值:255pictureBuilder.AddFormatter(picPath, 5, 60000, 0, 255, false);//此处只指定开始⾏与开始列,与上⾯差不多,但建议使⽤上⾯的⽤法pictureBuilder.AddFormatter(new PictureWithShapeInfo(picPath, new SheetRange() {MinRow=5,MinColumn=0 },false));特别说明:1.本类库是基于NPOI+ExcelReport,所有功能凡我的类库能够实现的,NPOI与ExcelReport都可以实现,只是⽤法及复杂程度不同⽽矣,我封装的⽬的就是为了降低⼤家的学习难度,提⾼使⽤效率,免费且开源,源代码同步更新⾄开源社区的GIT⽬录中,具体地址请看我该系列之前的⽂章有列出,在此就不再说明。
C#利用Microsoft.Office.Interop.Excel导出数据到Excel
C#利⽤Microsoft.Office.Interop.Excel导出数据到Excel添加引⽤(VS2013位于C:\Program Files (x86)\Microsoft Visual Studio 12.0\Visual Studio Tools for Office\PIA\Office15⽂件夹下)本案例是直接将DataTable⾥⾯的数据导⼊到Excel内,所以需将数据转换成DataTable数据类型才可以using Microsoft.Office.Interop.Excel;using System.Reflection;public void DataTableToExcel(System.Data.DataTable dataTable, string strTitle, string[] strHead, int[] columnWidth){int nMax = dataTable.Rows.Count;int nMin = 0;int rowCount = nMax - nMin + 1;//总⾏数const int columnCount = 7;//总列数//创建Excel对象Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();//新建⼯作簿Workbook workBook = excelApp.Workbooks.Add(true);//新建⼯作表Worksheet worksheet = workBook.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;////设置标题Microsoft.Office.Interop.Excel.Range titleRange = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnCount]];//选取单元格titleRange.Merge(true); //合并单元格titleRange.Value2 = strTitle; //设置单元格内⽂本 = "微软雅⿊"; //设置字体titleRange.Font.Size = 18; //字体⼤⼩titleRange.Font.Bold = true; //加粗显⽰titleRange.HorizontalAlignment = XlHAlign.xlHAlignCenter; //⽔平居中titleRange.VerticalAlignment = XlVAlign.xlVAlignCenter; //垂直居中titleRange.Borders.LineStyle = XlLineStyle.xlContinuous; //设置边框titleRange.Borders.Weight = XlBorderWeight.xlThin; //边框常规粗细//设置表头//string[] strHead = new string[columnCount] { "id", "productUid", "productBarcode", "checkData", "checkResult", "creater", "checkDate" };//int[] columnWidth = new int[columnCount] { 8, 24, 24, 22, 10, 14, 20 };for (int i = 0; i < columnCount; i++){Microsoft.Office.Interop.Excel.Range headRange = worksheet.Cells[2, i + 1] as Microsoft.Office.Interop.Excel.Range;//获取表头单元格,不⽤标题则从1开始headRange.Value2 = strHead[i]; //设置单元格⽂本 = "Consolas"; //设置字体headRange.Font.Size = 13; //字体⼤⼩headRange.Font.Bold = true; //加粗显⽰headRange.HorizontalAlignment = XlHAlign.xlHAlignCenter; //⽔平居中headRange.VerticalAlignment = XlVAlign.xlVAlignCenter; //垂直居中headRange.ColumnWidth = columnWidth[i]; //设置列宽headRange.Borders.LineStyle = XlLineStyle.xlContinuous; //设置边框headRange.Borders.Weight = XlBorderWeight.xlThin; //边框常规粗细}//设置每列格式for (int i = 0; i < columnCount; i++){Microsoft.Office.Interop.Excel.Range contentRange = worksheet.Range[worksheet.Cells[2, i + 1], worksheet.Cells[rowCount - 1 + 3, i + 1]];//不⽤标题则从第⼆⾏开始 = "Consolas";contentRange.Font.Size = 10;contentRange.HorizontalAlignment = XlHAlign.xlHAlignCenter; //⽔平居中contentRange.VerticalAlignment = XlVAlign.xlVAlignCenter; //垂直居中contentRange.Borders.LineStyle = XlLineStyle.xlContinuous; //设置边框contentRange.Borders.Weight = XlBorderWeight.xlThin; //边框常规粗细contentRange.WrapText = true; //⾃动换⾏contentRange.NumberFormatLocal = "@"; //⽂本格式}//填充数据for (int i = 0; i < dataTable.Rows.Count; i++){DataRow row = dataTable.Rows[i];for (int j = 0; j < dataTable.Columns.Count; j++){excelApp.Cells[i + 3, j + 1] = row[j].ToString();}}//设置Excel可见excelApp.Visible = true;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
foreach (String item in split)
{
dr[i] = item.Replace("\"", "");
i++;
}
dt.Rows.Add(dr);
}
sr.Close();
{
Excel.Range range = sheet.Cells[row, i + 1] as Excel.Range;
dr[i] = range.Text;
}
dt.Rows.Add(dr);
for (int i = 0; i < 10; i++)
{
Excel.Range range = sheet.Cells[1, i + 1] as Excel.Range;
dt.Columns.Add(range.Text);
}
int row = 2;
while (true)
using System.Data;
using System.IO;
using Model;
using System.Data.SqlClient;
using System.Windows.Forms;
using System.Data.OleDb;
namespace FileWay
foreach (String item in split)
{
dt.Columns.Add(item, System.Type.GetType("System.String"));
}
int i = 0;
while ((line=sr.ReadLine())!=null)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
row++;
}
return dt;
}
/// <summary>
/// 生成Excel
/// </summary>
/// <param name="datas">Table</param>
/// <param name="p">路径</param>
{
dt.Columns.Add(item, System.Type.GetType("System.String"));
}
int r.ReadLine()) != null)
{
i = 0;
dr = dt.NewRow();
/// HotelAmenities
/// </summary>
/// <param name="ExcelPath">ExcelPath路径.CSV</param>
/// <returns></returns>
{
public class ChangeExcel
{
private string strcon = "server=127.0.0.1;uid=sa;pwd=sasa;database=数据库名";
public void Changes(string Ways) {
Excel.Application app = new Excel.Application();
ha.EditedDate = DateTime.Now;
list.Add(ha);
}
return list;
}
/// <summary>
/// 通过Excel获取Table
/// </summary>
/// <returns></returns>
using (SqlBulkCopy datecopy = new SqlBulkCopy(conn))
{
datecopy.DestinationTableName = tableName;
try
{
datecopy.WriteToServer(dt);//复制DataTable数据到数据库
i++;
}
dt.Rows.Add(dr);
}
sr.Close();
CopyToService("HotelAmenities", dt);//复制表数据到数据库
}
/// <summary>
/// 将Table转换成List
/// </summary>
private void DataGridToExcel(DataTable datas, string p)
{
Excel.Application app = new Excel.Application();
app.SheetsInNewWorkbook = 1;
app.Workbooks.Add();
ha.AmenityId = Convert.ToInt32(item[2].ToString());
ha.AmenityName = item[3].ToString();
ha.Timestamp = Convert.ToDateTime(item[4].ToString());
ha.ProductStatus = item[5].ToString();
StreamReader sr = new StreamReader(@"D:HBE城市代码表.xlsx", System.Text.Encoding.UTF8);
line = sr.ReadLine();
split = line.Split('|');
foreach (String item in split)
DataTable dt = new DataTable();
app.Workbooks.Open(Ways);
Excel.Worksheet sheet = app.ActiveWorkbook.Worksheets[1];
}
/// <summary>
/// J
/// 通过Excel获取Table
}
for (int i = 0; i < datas.Rows.Count; i++)
{
for (int j = 0; j < datas.Columns.Count; j++)
{
Excel.Range ran = sheet.Cells[row, 2] as Excel.Range;
if (string.IsNullOrEmpty(ran.Text.Trim()))
{
break;
}
DataRow dr = dt.NewRow();
for (int i = 0; i < 10; i++)
{
i = 0;
dr = dt.NewRow();
split = line.Split('|');
foreach (String item in split)
{
dr[i] = item.Replace("\"", "");
MessageBox.Show("OK!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
return "";
}
/// <summary>
/// Excel转Table
return ds;
}
/// <summary>
/// J
/// 数据操作
///
/// </summary>
/// <returns></returns>
public string CopyToServices(string tableName, DataTable dt)