工作表操作详解
本页是工作簿与工作表操作基础的续篇,可结合前文一起阅读。
工作表基础操作
工作表创建与管理
工作表创建与配置
工作表是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; }
}
}