Skip to content

工作表操作详解 ​

本页是工作簿与工作表操作基础的续篇,可结合前文一起阅读。

工作表基础操作 ​

工作表创建与管理 ​

工作表创建与配置 ​

工作表是Excel工作簿的核心组成部分,MudTools.OfficeInterop.Excel提供了丰富的工作表操作功能:

csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;

namespace WorksheetManagementExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== 工作表管理示例 ===");
            
            try
            {
                // 创建工作簿并管理工作表
                using var excelApp = ExcelFactory.BlankWorkbook();
                var workbook = excelApp.ActiveWorkbook;
                
                // 工作表管理操作
                ManageWorksheets(workbook);
                
                // 保存工作簿
                string fileName = $"WorksheetManagement_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                workbook.SaveAs(fileName);
                
                Console.WriteLine($"\n✓ 工作表管理示例完成: {fileName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 工作表管理时出错: {ex.Message}");
            }
            
            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
        
        static void ManageWorksheets(IExcelWorkbook workbook)
        {
            Console.WriteLine("\n1. 工作表基本操作");
            
            // 获取默认工作表
            var defaultSheet = workbook.ActiveSheetWrap;
            defaultSheet.Name = "主工作表";
            Console.WriteLine($"  默认工作表: {defaultSheet.Name}");
            
            // 创建新工作表
            Console.WriteLine("\n2. 创建新工作表");
            
            for (int i = 1; i <= 3; i++)
            {
                var newSheet = workbook.Worksheets.Add();
                newSheet.Name = $"数据表{i}";
                
                // 设置工作表标签颜色
                newSheet.Tab.Color = GetTabColor(i);
                
                // 在新工作表中添加数据
                InitializeWorksheet(newSheet, i);
                
                Console.WriteLine($"  ✓ 创建工作表: {newSheet.Name}");
            }
            
            // 工作表排序和重命名
            Console.WriteLine("\n3. 工作表排序和重命名");
            
            // 重命名工作表
            var sheetToRename = workbook.Worksheets[2];
            sheetToRename.Name = "重命名的工作表";
            Console.WriteLine($"  ✓ 重命名工作表: {sheetToRename.Name}");
            
            // 移动工作表位置
            var sheetToMove = workbook.Worksheets["数据表3"];
            sheetToMove.Move(workbook.Worksheets[1]); // 移动到第一个位置
            Console.WriteLine("  ✓ 移动工作表位置");
            
            // 显示所有工作表信息
            Console.WriteLine("\n4. 工作表列表");
            DisplayWorksheetList(workbook);
            
            // 工作表保护
            Console.WriteLine("\n5. 工作表保护");
            ProtectWorksheets(workbook);
        }
        
        static System.Drawing.Color GetTabColor(int index)
        {
            return index switch
            {
                1 => System.Drawing.Color.LightBlue,
                2 => System.Drawing.Color.LightGreen,
                3 => System.Drawing.Color.LightYellow,
                _ => System.Drawing.Color.LightGray
            };
        }
        
        static void InitializeWorksheet(IExcelWorksheet worksheet, int sheetNumber)
        {
            // 设置标题
            worksheet.Range("A1").Value = $"工作表{sheetNumber} - 示例数据";
            worksheet.Range("A1").Font.Bold = true;
            worksheet.Range("A1").Font.Size = 14;
            
            // 添加表头
            string[] headers = { "项目", "数量", "单价", "总价" };
            for (int i = 0; i < headers.Length; i++)
            {
                worksheet.Cells[3, i + 1].Value = headers[i];
                worksheet.Cells[3, i + 1].Font.Bold = true;
                worksheet.Cells[3, i + 1].Interior.Color = System.Drawing.Color.LightGray;
            }
            
            // 添加示例数据
            for (int i = 1; i <= 5; i++)
            {
                int row = i + 3;
                worksheet.Cells[row, 1].Value = $"项目{sheetNumber}-{i}";
                worksheet.Cells[row, 2].Value = i * 2;
                worksheet.Cells[row, 3].Value = i * 100;
                worksheet.Cells[row, 4].Formula = $"=B{row}*C{row}";
            }
            
            // 设置格式
            worksheet.Range("A3:D8").Borders.LineStyle = XlLineStyle.xlContinuous;
            worksheet.Columns["A:D"].AutoFit();
        }
        
        static void DisplayWorksheetList(IExcelWorkbook workbook)
        {
            Console.WriteLine("  工作簿中的工作表:");
            
            for (int i = 1; i <= workbook.Worksheets.Count; i++)
            {
                var sheet = workbook.Worksheets[i];
                Console.WriteLine($"    {i}. {sheet.Name} (Visible: {sheet.Visible}, Index: {sheet.Index})");
            }
        }
        
        static void ProtectWorksheets(IExcelWorkbook workbook)
        {
            // 保护特定工作表
            var sheetToProtect = workbook.Worksheets["重命名的工作表"];
            sheetToProtect.Protect("password123", true, true, true, true, true, true, true, true);
            Console.WriteLine("  ✓ 工作表保护已启用");
            
            // 尝试修改受保护的工作表(应该失败)
            try
            {
                sheetToProtect.Range("A1").Value = "尝试修改";
                Console.WriteLine("  ⚠ 修改成功(不应该发生)");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"  ✓ 修改被阻止(预期行为): {ex.Message}");
            }
            
            // 取消保护
            sheetToProtect.Unprotect("password123");
            Console.WriteLine("  ✓ 工作表保护已取消");
            
            // 验证可以修改
            sheetToProtect.Range("A1").Value = "现在可以修改";
            Console.WriteLine("  ✓ 修改成功");
        }
    }
}

工作表高级操作 ​

工作表的高级操作包括复制、隐藏、分组等功能:

csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;

namespace WorksheetAdvancedOperations
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== 工作表高级操作示例 ===");
            
            try
            {
                using var excelApp = ExcelFactory.BlankWorkbook();
                var workbook = excelApp.ActiveWorkbook;
                
                // 执行高级操作
                PerformAdvancedOperations(workbook);
                
                // 保存工作簿
                string fileName = $"AdvancedWorksheetOps_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                workbook.SaveAs(fileName);
                
                Console.WriteLine($"\n✓ 高级操作示例完成: {fileName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 高级操作时出错: {ex.Message}");
            }
            
            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
        
        static void PerformAdvancedOperations(IExcelWorkbook workbook)
        {
            // 创建基础工作表
            var mainSheet = workbook.ActiveSheetWrap;
            mainSheet.Name = "主数据";
            InitializeMainSheet(mainSheet);
            
            Console.WriteLine("\n1. 工作表复制操作");
            
            // 复制工作表
            var copiedSheet = mainSheet.Copy();
            copiedSheet.Name = "数据备份";
            Console.WriteLine("  ✓ 工作表复制完成");
            
            // 复制到特定位置
            var specificCopy = mainSheet.Copy(workbook.Worksheets[1]);
            specificCopy.Name = "前置副本";
            Console.WriteLine("  ✓ 特定位置复制完成");
            
            Console.WriteLine("\n2. 工作表隐藏与显示");
            
            // 隐藏工作表
            var sheetToHide = workbook.Worksheets.Add();
            sheetToHide.Name = "隐藏的工作表";
            sheetToHide.Visible = XlSheetVisibility.xlSheetHidden;
            Console.WriteLine("  ✓ 工作表隐藏完成");
            
            // 深度隐藏(用户无法通过界面取消隐藏)
            var veryHiddenSheet = workbook.Worksheets.Add();
            veryHiddenSheet.Name = "深度隐藏表";
            veryHiddenSheet.Visible = XlSheetVisibility.xlSheetVeryHidden;
            Console.WriteLine("  ✓ 深度隐藏完成");
            
            Console.WriteLine("\n3. 工作表分组操作");
            
            // 创建分组工作表
            CreateWorksheetGroup(workbook);
            
            Console.WriteLine("\n4. 工作表保护与权限");
            
            // 高级保护设置
            ConfigureAdvancedProtection(workbook);
            
            Console.WriteLine("\n5. 工作表事件处理");
            
            // 工作表事件演示
            SetupWorksheetEvents(workbook);
        }
        
        static void InitializeMainSheet(IExcelWorksheet worksheet)
        {
            worksheet.Range("A1").Value = "主数据表";
            worksheet.Range("A1").Font.Bold = true;
            
            // 添加示例数据
            for (int i = 1; i <= 10; i++)
            {
                worksheet.Cells[i + 1, 1].Value = $"数据项{i}";
                worksheet.Cells[i + 1, 2].Value = i * 50;
                worksheet.Cells[i + 1, 3].Value = DateTime.Now.AddDays(i);
            }
            
            worksheet.Columns["A:C"].AutoFit();
        }
        
        static void CreateWorksheetGroup(IExcelWorkbook workbook)
        {
            // 创建一组相关的工作表
            for (int i = 1; i <= 3; i++)
            {
                var groupSheet = workbook.Worksheets.Add();
                groupSheet.Name = $"季度{i}数据";
                
                // 设置相同的格式
                groupSheet.Range("A1").Value = $"第{i}季度报告";
                groupSheet.Range("A1").Font.Bold = true;
                groupSheet.Tab.Color = System.Drawing.Color.LightBlue;
                
                Console.WriteLine($"  ✓ 创建分组工作表: {groupSheet.Name}");
            }
            
            // 可以选择性地分组这些工作表
            // 注意:实际分组操作需要通过VBA或用户界面完成
            Console.WriteLine("  ⚠ 工作表分组通常通过VBA或用户界面完成");
        }
        
        static void ConfigureAdvancedProtection(IExcelWorkbook workbook)
        {
            var protectedSheet = workbook.Worksheets.Add();
            protectedSheet.Name = "高级保护表";
            
            // 设置允许用户编辑的区域
            protectedSheet.Range("A1:A10").Value = "可编辑区域";
            protectedSheet.Range("B1:B10").Value = "受保护区域";
            
            // 保护工作表,但允许某些操作
            protectedSheet.Protect("advanced123", 
                allowFormattingCells: true,
                allowFormattingColumns: true,
                allowFormattingRows: true,
                allowInsertingColumns: false,
                allowInsertingRows: false,
                allowInsertingHyperlinks: false,
                allowDeletingColumns: false,
                allowDeletingRows: false,
                allowSorting: true,
                allowFiltering: true,
                allowUsingPivotTables: true
            );
            
            Console.WriteLine("  ✓ 高级保护设置完成");
            
            // 测试保护效果
            try
            {
                // 尝试在受保护区域修改(应该失败)
                protectedSheet.Range("B1").Value = "尝试修改";
                Console.WriteLine("  ⚠ 修改成功(不应该发生)");
            }
            catch (Exception)
            {
                Console.WriteLine("  ✓ 受保护区域修改被阻止(预期行为)");
            }
            
            try
            {
                // 尝试在可编辑区域修改(应该成功)
                protectedSheet.Range("A1").Value = "修改成功";
                Console.WriteLine("  ✓ 可编辑区域修改成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"  ⚠ 可编辑区域修改失败: {ex.Message}");
            }
        }
        
        static void SetupWorksheetEvents(IExcelWorkbook workbook)
        {
            var eventSheet = workbook.Worksheets.Add();
            eventSheet.Name = "事件测试表";
            
            // 注意:工作表事件处理需要通过事件处理程序
            // 这里演示事件处理的基本概念
            
            eventSheet.Range("A1").Value = "事件测试区域";
            eventSheet.Range("A1").Interior.Color = System.Drawing.Color.LightYellow;
            
            Console.WriteLine("  ⚠ 工作表事件处理需要额外的事件处理程序配置");
            Console.WriteLine("    常见事件: SelectionChange, Change, Activate, Deactivate");
            
            // 在实际应用中,可以通过EventHandler类来处理事件
            // var eventHandler = new EventHandler(workbook);
            // eventHandler.WorksheetSelectionChange += OnWorksheetSelectionChange;
        }
    }
}

工作表导航与选择 ​

工作表导航操作 ​

工作表导航是Excel自动化中的基本操作,包括激活、选择、遍历等工作表:

csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;

namespace WorksheetNavigationExample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== 工作表导航示例 ===");
            
            try
            {
                using var excelApp = ExcelFactory.BlankWorkbook();
                var workbook = excelApp.ActiveWorkbook;
                
                // 创建多个工作表用于导航测试
                CreateNavigationWorksheets(workbook);
                
                // 执行导航操作
                PerformNavigationOperations(workbook);
                
                // 保存工作簿
                string fileName = $"WorksheetNavigation_{DateTime.Now:yyyyMMddHHmmss}.xlsx";
                workbook.SaveAs(fileName);
                
                Console.WriteLine($"\n✓ 导航操作示例完成: {fileName}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"✗ 导航操作时出错: {ex.Message}");
            }
            
            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }
        
        static void CreateNavigationWorksheets(IExcelWorkbook workbook)
        {
            Console.WriteLine("创建导航测试工作表...");
            
            // 重命名默认工作表
            workbook.ActiveSheetWrap.Name = "首页";
            
            // 创建多个工作表
            for (int i = 1; i <= 5; i++)
            {
                var sheet = workbook.Worksheets.Add();
                sheet.Name = $"工作表{i}";
                
                // 在每个工作表中添加标识
                sheet.Range("A1").Value = $"这是{sheet.Name}";
                sheet.Range("A1").Font.Bold = true;
                sheet.Range("A1").Font.Color = GetSheetColor(i);
                
                // 添加导航标记
                for (int j = 1; j <= 3; j++)
                {
                    sheet.Cells[j + 2, 1].Value = $"导航点{j}";
                    sheet.Cells[j + 2, 2].Value = j * 100;
                }
                
                Console.WriteLine($"  ✓ 创建: {sheet.Name}");
            }
        }
        
        static System.Drawing.Color GetSheetColor(int index)
        {
            return index switch
            {
                1 => System.Drawing.Color.Red,
                2 => System.Drawing.Color.Blue,
                3 => System.Drawing.Color.Green,
                4 => System.Drawing.Color.Orange,
                5 => System.Drawing.Color.Purple,
                _ => System.Drawing.Color.Black
            };
        }
        
        static void PerformNavigationOperations(IExcelWorkbook workbook)
        {
            Console.WriteLine("\n1. 基础导航操作");
            
            // 激活特定工作表
            var sheet3 = workbook.Worksheets["工作表3"];
            sheet3.Activate();
            Console.WriteLine($"  ✓ 激活工作表: {sheet3.Name}");
            
            // 获取当前活动工作表
            var activeSheet = workbook.ActiveSheetWrap;
            Console.WriteLine($"  当前活动工作表: {activeSheet.Name}");
            
            Console.WriteLine("\n2. 工作表遍历");
            
            // 遍历所有工作表
            Console.WriteLine("  工作表列表:");
            foreach (IExcelWorksheet sheet in workbook.Worksheets)
            {
                string status = sheet == activeSheet ? "[当前]" : "";
                Console.WriteLine($"    {sheet.Index}. {sheet.Name} {status}");
            }
            
            Console.WriteLine("\n3. 条件导航");
            
            // 根据条件导航到特定工作表
            NavigateByCondition(workbook);
            
            Console.WriteLine("\n4. 工作表选择操作");
            
            // 选择多个工作表
            SelectMultipleWorksheets(workbook);
            
            Console.WriteLine("\n5. 高级导航技巧");
            
            // 使用高级导航技术
            AdvancedNavigationTechniques(workbook);
        }
        
        static void NavigateByCondition(IExcelWorkbook workbook)
        {
            // 导航到包含特定内容的工作表
            foreach (IExcelWorksheet sheet in workbook.Worksheets)
            {
                // 检查工作表是否包含特定内容
                var searchValue = sheet.Range("A1").Value?.ToString();
                if (searchValue != null && searchValue.Contains("工作表3"))
                {
                    sheet.Activate();
                    Console.WriteLine($"  ✓ 条件导航到: {sheet.Name}");
                    break;
                }
            }
            
            // 导航到第一个可见工作表
            foreach (IExcelWorksheet sheet in workbook.Worksheets)
            {
                if (sheet.Visible == XlSheetVisibility.xlSheetVisible)
                {
                    sheet.Activate();
                    Console.WriteLine($"  ✓ 导航到第一个可见工作表: {sheet.Name}");
                    break;
                }
            }
        }
        
        static void SelectMultipleWorksheets(IExcelWorkbook workbook)
        {
            Console.WriteLine("  选择多个工作表:");
            
            // 选择连续的工作表
            try
            {
                workbook.Worksheets["工作表1"].Select();
                workbook.Worksheets["工作表2"].Select(false); // 添加到选择
                workbook.Worksheets["工作表3"].Select(false); // 添加到选择
                
                Console.WriteLine("  ✓ 选择连续工作表: 工作表1, 工作表2, 工作表3");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"  ⚠ 连续选择失败: {ex.Message}");
            }
            
            // 选择不连续的工作表(需要通过VBA或特定方法)
            Console.WriteLine("  ⚠ 不连续选择通常通过VBA或特定API完成");
        }
        
        static void AdvancedNavigationTechniques(IExcelWorkbook workbook)
        {
            Console.WriteLine("\n5. 高级导航技巧");
            
            // 技巧1:使用索引导航
            var firstSheet = workbook.Worksheets[1];
            firstSheet.Activate();
            Console.WriteLine($"  ✓ 索引导航: {firstSheet.Name}");
            
            // 技巧2:使用名称导航(带错误处理)
            try
            {
                var nonExistentSheet = workbook.Worksheets["不存在的工作表"];
                nonExistentSheet.Activate();
            }
            catch (Exception ex)
            {
                Console.WriteLine($"  ✓ 错误处理导航: {ex.Message}");
            }
            
            // 技巧3:循环导航
            Console.WriteLine("  循环导航演示:");
            for (int i = 1; i <= Math.Min(3, workbook.Worksheets.Count); i++)
            {
                workbook.Worksheets[i].Activate();
                Console.WriteLine($"    → 导航到: {workbook.ActiveSheetWrap.Name}");
                Thread.Sleep(500); // 模拟延迟
            }
            
            // 技巧4:保存和恢复导航状态
            Console.WriteLine("\n6. 导航状态管理");
            
            var navigationManager = new WorksheetNavigationManager(workbook);
            navigationManager.DemonstrateStateManagement();
        }
    }
    
    public class WorksheetNavigationManager
    {
        private IExcelWorkbook _workbook;
        private Stack<WorksheetNavigationState> _navigationStack;
        
        public WorksheetNavigationManager(IExcelWorkbook workbook)
        {
            _workbook = workbook;
            _navigationStack = new Stack<WorksheetNavigationState>();
        }
        
        public void DemonstrateStateManagement()
        {
            Console.WriteLine("  导航状态管理演示:");
            
            // 保存当前状态
            SaveCurrentState();
            Console.WriteLine("  ✓ 保存当前导航状态");
            
            // 导航到其他工作表
            _workbook.Worksheets["工作表4"].Activate();
            Console.WriteLine($"  → 导航到: {_workbook.ActiveSheetWrap.Name}");
            
            // 保存新状态
            SaveCurrentState();
            Console.WriteLine("  ✓ 保存新导航状态");
            
            // 恢复上一个状态
            RestorePreviousState();
            Console.WriteLine($"  ← 恢复到: {_workbook.ActiveSheetWrap.Name}");
            
            // 显示导航历史
            DisplayNavigationHistory();
        }
        
        private void SaveCurrentState()
        {
            var state = new WorksheetNavigationState
            {
                SheetName = _workbook.ActiveSheetWrap.Name,
                Timestamp = DateTime.Now,
                Selection = _workbook.ActiveSheetWrap.Selection?.Address
            };
            
            _navigationStack.Push(state);
        }
        
        private void RestorePreviousState()
        {
            if (_navigationStack.Count > 1)
            {
                _navigationStack.Pop(); // 移除当前状态
                var previousState = _navigationStack.Peek();
                
                // 导航到之前的工作表
                var targetSheet = _workbook.Worksheets[previousState.SheetName];
                targetSheet.Activate();
            }
        }
        
        private void DisplayNavigationHistory()
        {
            Console.WriteLine("  导航历史:");
            int count = 1;
            
            foreach (var state in _navigationStack.Reverse())
            {
                string currentIndicator = count == _navigationStack.Count ? "[当前]" : "";
                Console.WriteLine($"    {count}. {state.SheetName} - {state.Timestamp:HH:mm:ss} {currentIndicator}");
                count++;
            }
        }
    }
    
    public class WorksheetNavigationState
    {
        public string SheetName { get; set; }
        public DateTime Timestamp { get; set; }
        public string Selection { get; set; }
    }
}