You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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冻结并更新进度:

  1. 在Form设计界面添加BackgroundWorker组件(命名为backgroundWorker1),勾选WorkerReportsProgress和WorkerSupportsCancellation属性。
  2. 添加以下事件处理方法:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:27:04