C# winform 可视化操作 Excel文件并读取数据

 

本人近期接到一个任务,要求开发一个可以操作和读取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 方法

                            // 填充值
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# WinForm 中,可以使用 DataGridView 控件来显示数据,并且可以实现分页功能。下面是一个简单的实现分页功能的示例代码: 首先,在窗体中添加一个 DataGridView 控件和两个 Button 控件,一个用于上一页,一个用于下一页。然后在窗体的 Load 事件中,初始 DataGridView 控件并设置数据源: ``` private void Form1_Load(object sender, EventArgs e) { // 初始 DataGridView 控件 dataGridView1.AutoGenerateColumns = true; dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.MultiSelect = false; dataGridView1.ReadOnly = true; // 设置数据源 dataGridView1.DataSource = GetData(1, pageSize); } ``` 其中,GetData() 方法用于获取数据源,第一个参数表示当前页码,第二个参数表示每页显示的数据条数。这个方法需要根据具体的业务逻辑来实现。 接下来,实现上一页和下一页的按钮点击事件: ``` private void btnPrev_Click(object sender, EventArgs e) { if (currentPage > 1) { currentPage--; dataGridView1.DataSource = GetData(currentPage, pageSize); } } private void btnNext_Click(object sender, EventArgs e) { if (currentPage < totalPages) { currentPage++; dataGridView1.DataSource = GetData(currentPage, pageSize); } } ``` 其中,currentPage 表示当前页码,totalPages 表示总页数。在点击上一页和下一页按钮时,需要判断当前是否到达了第一页或最后一页,如果没有,则更新当前页码并重新设置数据源。 最后,需要根据总数据条数和每页显示的数据条数计算总页数,并在窗体中显示出来: ``` private void DisplayPageInfo() { // 计算总页数 int totalCount = GetTotalCount(); totalPages = (int)Math.Ceiling((double)totalCount / pageSize); // 显示当前页码和总页数 lblPageInfo.Text = string.Format("第 {0} 页,共 {1} 页", currentPage, totalPages); } ``` 其中,GetTotalCount() 方法用于获取总数据条数,需要根据具体的业务逻辑来实现。 完整的代码示例: ``` public partial class Form1 : Form { private int pageSize = 10; // 每页显示的数据条数 private int currentPage = 1; // 当前页码 private int totalPages = 0; // 总页数 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 初始 DataGridView 控件 dataGridView1.AutoGenerateColumns = true; dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.MultiSelect = false; dataGridView1.ReadOnly = true; // 设置数据源 dataGridView1.DataSource = GetData(1, pageSize); // 显示当前页码和总页数 DisplayPageInfo(); } private void btnPrev_Click(object sender, EventArgs e) { if (currentPage > 1) { currentPage--; dataGridView1.DataSource = GetData(currentPage, pageSize); DisplayPageInfo(); } } private void btnNext_Click(object sender, EventArgs e) { if (currentPage < totalPages) { currentPage++; dataGridView1.DataSource = GetData(currentPage, pageSize); DisplayPageInfo(); } } private void DisplayPageInfo() { // 计算总页数 int totalCount = GetTotalCount(); totalPages = (int)Math.Ceiling((double)totalCount / pageSize); // 显示当前页码和总页数 lblPageInfo.Text = string.Format("第 {0} 页,共 {1} 页", currentPage, totalPages); } private DataTable GetData(int pageNum, int pageSize) { // 根据当前页码和每页显示的数据条数获取数据源 // 这里只是一个示例,需要根据具体的业务逻辑来实现 DataTable dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Columns.Add("Age", typeof(int)); for (int i = 1; i <= pageSize; i++) { int id = (pageNum - 1) * pageSize + i; dt.Rows.Add(id, "Name" + id, 20 + i); } return dt; } private int GetTotalCount() { // 获取总数据条数 // 这里只是一个示例,需要根据具体的业务逻辑来实现 return 100; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值