Office旧格式转新格式工具开发求助:读取TextBox文件与进度条实现
旧Office格式转新格式Windows Forms应用实现方案
需求概述
- 支持批量选择doc、xls、ppt格式文件,文件名显示在TextBox1中
- 点击转换按钮将文件转为对应的docx、xlsx、pptx格式
- 新增:获取文件完整路径完成转换,添加进度条显示转换进度
核心问题修复与实现步骤
1. 保存文件完整路径
原代码仅在TextBox中显示文件名,丢失了完整路径。我们需要额外维护一个List<string>来存储选中文件的完整路径,TextBox只负责展示文件名:
在Form1类中添加成员变量:
private List<string> selectedFiles = new List<string>();
修改BTNBrowse_Click方法:
private void BTNBrowse_Click(object sender, EventArgs e) { var dialog = new OpenFileDialog(); dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); dialog.Title = "选择旧版Office文件"; dialog.Filter = "旧版Office文件|*.doc;*.xls;*.ppt"; dialog.Multiselect = true; if (dialog.ShowDialog() == DialogResult.OK) { selectedFiles.Clear(); textBox1.Clear(); foreach (string file in dialog.FileNames) { selectedFiles.Add(file); textBox1.AppendText(Path.GetFileName(file) + Environment.NewLine); } BTNConvert.Enabled = true; BTNClear.Enabled = true; } }
2. 实现格式转换逻辑
利用已引用的Spire系列库,针对不同文件格式编写转换方法:
在Form1类中添加转换方法:
private void ConvertFile(string filePath) { var extension = Path.GetExtension(filePath).ToLower(); var outputPath = Path.ChangeExtension(filePath, extension.Replace(".", ".x")); try { switch (extension) { case ".doc": var doc = new Spire.Doc.Document(); doc.LoadFromFile(filePath); doc.SaveToFile(outputPath, Spire.Doc.FileFormat.Docx); doc.Close(); break; case ".xls": var xls = new Spire.Xls.Workbook(); xls.LoadFromFile(filePath); xls.SaveToFile(outputPath, Spire.Xls.FileFormat.Version2016); xls.Dispose(); break; case ".ppt": var ppt = new Spire.Presentation.Presentation(); ppt.LoadFromFile(filePath); ppt.SaveToFile(outputPath, Spire.Presentation.FileFormat.Pptx2016); ppt.Dispose(); break; } } catch (Exception ex) { MessageBox.Show($"转换文件 {Path.GetFileName(filePath)} 失败: {ex.Message}"); } }
3. 添加进度条实现异步转换
使用BackgroundWorker组件实现异步转换,避免UI冻结并更新进度:
- 在Form设计界面添加
BackgroundWorker组件(命名为backgroundWorker1),勾选WorkerReportsProgress和WorkerSupportsCancellation属性。 - 添加以下事件处理方法:
private void BTNConvert_Click(object sender, EventArgs e) { if (selectedFiles.Count == 0) return; BTNConvert.Enabled = false; backgroundWorker1.RunWorkerAsync(selectedFiles); } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { var files = e.Argument as List<string>; for (int i = 0; i < files.Count; i++) { if (backgroundWorker1.CancellationPending) { e.Cancel = true; break; } ConvertFile(files[i]); backgroundWorker1.ReportProgress((i + 1) * 100 / files.Count); } } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { progressBar1.Value = 0; BTNConvert.Enabled = true; if (e.Error != null) { MessageBox.Show($"转换过程出错: {e.Error.Message}"); } else if (e.Cancelled) { MessageBox.Show("转换已取消"); } else { MessageBox.Show("所有文件转换完成"); } }
完整修正后的代码
using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windows.Forms; using Spire.Doc; using Spire.Xls; using Spire.Presentation; namespace T_Converter { public partial class Form1 : Form { private List<string> selectedFiles = new List<string>(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { BTNClear.Enabled = false; BTNConvert.Enabled = false; // 绑定BackgroundWorker事件 backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged; backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted; } private void BTNBrowse_Click(object sender, EventArgs e) { var dialog = new OpenFileDialog(); dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); dialog.Title = "选择旧版Office文件"; dialog.Filter = "旧版Office文件|*.doc;*.xls;*.ppt"; dialog.Multiselect = true; if (dialog.ShowDialog() == DialogResult.OK) { selectedFiles.Clear(); textBox1.Clear(); foreach (string file in dialog.FileNames) { selectedFiles.Add(file); textBox1.AppendText(Path.GetFileName(file) + Environment.NewLine); } BTNConvert.Enabled = true; BTNClear.Enabled = true; } } private void BTNClear_Click(object sender, EventArgs e) { textBox1.Clear(); selectedFiles.Clear(); BTNClear.Enabled = false; BTNConvert.Enabled = false; } private void BTNClose_Click(object sender, EventArgs e) { this.Close(); } private void BTNConvert_Click(object sender, EventArgs e) { if (selectedFiles.Count == 0) return; BTNConvert.Enabled = false; backgroundWorker1.RunWorkerAsync(selectedFiles); } private void ConvertFile(string filePath) { var extension = Path.GetExtension(filePath).ToLower(); var outputPath = Path.ChangeExtension(filePath, extension.Replace(".", ".x")); try { switch (extension) { case ".doc": var doc = new Document(); doc.LoadFromFile(filePath); doc.SaveToFile(outputPath, FileFormat.Docx); doc.Close(); break; case ".xls": var xls = new Spire.Xls.Workbook(); xls.LoadFromFile(filePath); xls.SaveToFile(outputPath, Spire.Xls.FileFormat.Version2016); xls.Dispose(); break; case ".ppt": var ppt = new Presentation(); ppt.LoadFromFile(filePath); ppt.SaveToFile(outputPath, Spire.Presentation.FileFormat.Pptx2016); ppt.Dispose(); break; } } catch (Exception ex) { MessageBox.Show($"转换文件 {Path.GetFileName(filePath)} 失败: {ex.Message}"); } } private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { var files = e.Argument as List<string>; for (int i = 0; i < files.Count; i++) { if (backgroundWorker1.CancellationPending) { e.Cancel = true; break; } ConvertFile(files[i]); backgroundWorker1.ReportProgress((i + 1) * 100 / files.Count); } } private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { progressBar1.Value = 0; BTNConvert.Enabled = true; if (e.Error != null) { MessageBox.Show($"转换过程出错: {e.Error.Message}"); } else if (e.Cancelled) { MessageBox.Show("转换已取消"); } else { MessageBox.Show("所有文件转换完成"); } } } }
注意事项
- 确保已正确安装Spire.Doc、Spire.Xls、Spire.Presentation NuGet包
- 转换后的文件会保存在原文件同目录下,文件名与原文件一致,后缀替换为新格式
- 若需取消转换,可添加取消按钮并调用
backgroundWorker1.CancelAsync()
内容的提问来源于stack exchange,提问作者Aamir Karim
相关产品推荐
相关产品推荐

