本人近期接到一个任务,要求开发一个可以操作和读取Excel文件的软件。
花了几天时间开发完成。本机跑的可以,兼容性还待检测。
解决方案:
dsoframer.ocx + Microsoft.Office.Interop.Excel
dsoframer.ocx 是用来可视化操作office文件的C#控件,Microsoft.Office.Interop.Excel 是用来操作和读取的控件。
效果图如下:
这个是可视化操作,导入excel文件,可以删除行,当然所有的excel操作都可以,已测试wps和Microsoft office 软件都可以正常读取和操作。导入数据是将excel数据读取到DataTable 中。
第一行和第一列是通过代码添加的,具体实现方式将在下面贴出来。
DataTable 读取到数据展示如下:
代码部分:
using System; using System.Data; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; using System.Data.OleDb; using System.Collections.Generic; using System.Text.RegularExpressions; namespace ReadExcel { public partial class Form1 : Form { private AxDSOFramer.AxFramerControl m_axFramerControl = new AxDSOFramer.AxFramerControl(); System.Data.DataTable dtEnd = new System.Data.DataTable(); bool isOpenExcel = false; public Form1() { InitializeComponent(); } #region 按钮事件 private void button1_Click(object sender, EventArgs e) { //读取excel OpenFileDialog dia = new OpenFileDialog(); dia.Filter = "公路计价文件(*.xls)|*.xls;*.xlsx"; dia.FilterIndex = 0; dia.ShowDialog(); if (string.IsNullOrEmpty(dia.FileName)) { return; } if (isOpenExcel == true)//先关闭已打开的excel { try { CloseFrom(); } catch (Exception) { } } //复制到本地 因为快捷方式可以用,修改后可以保存,会导致修改源文件 string tempFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TempFile"); if (!System.IO.Directory.Exists(tempFile)) System.IO.Directory.CreateDirectory(tempFile); string tempExcelPath = Path.Combine(tempFile, "tempExcel" + Path.GetExtension(dia.FileName)); System.IO.File.Copy(dia.FileName, tempExcelPath, true); try { //打开本地excel Init(tempExcelPath); isOpenExcel = true; try { //所有的sheet都应该增加 object documentExcel = m_axFramerControl.ActiveDocument; //// 获取当前工作薄 Workbook workbook = (Microsoft.Office.Interop.Excel.Workbook)documentExcel; foreach (Worksheet worksheet in workbook.Sheets) { if (worksheet != null) { int columnsint = worksheet.UsedRange.Cells.Columns.Count;//得到列数 int rowsint = worksheet.UsedRange.Rows.Count; //得到行数 if (rowsint == 1) continue; #region 增加行 Range range = (Range)worksheet.Rows[1, Type.Missing]; //object Range.Insert(object shift, object copyorigin); //shift: Variant类型,可选。指定单元格的调整方式。可以为下列 XlInsertShiftDirection 常量之一: //xlShiftToRight 或 xlShiftDown。如果省略该参数,Microsoft Excel 将根据区域形状确定调整方式。 range.Insert(XlInsertShiftDirection.xlShiftDown, Type.Missing); System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("Name"); DataRow dr = dt.NewRow(); dr[0] = "姓名"; dt.Rows.Add(dr); DataRow dr1 = dt.NewRow(); dr1[0] = "性别"; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2[0] = "年龄"; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3[0] = "地址"; dt.Rows.Add(dr3); range = worksheet.get_Range("A1", ToName(columnsint - 1) + "1"); range.RowHeight = 30; range.Font.Bold = true; string strName = GetNameFromDt(dt); //绑定下拉列表 range.Validation.Add(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertStop, XlFormatConditionOperator.xlBetween, strName, Type.Missing);//Name就是上面获取的列表 // range.Validation.Modify(XlDVType.xlValidateList, XlDVAlertStyle.xlValidAlertStop, Type.Missing, strName, Type.Missing);//单元格已设置数据有效性,只能用代码修改有效性;如果单元格未设置有效性,需要使用 Add 方法 // 填充值