C# - 从C#WinForm应用程序运行/执行“Excel到CSV文件转换器”控制台应用程序

时间:2011-03-18 21:03:01

标签: c# winforms error-handling console-application

我正在使用带有OpenFileDialog,FileBrowserDialog的C#开发WinForms应用程序,并且我已经启用了我想要的多个xls文件的选择:

  1. 将所选文件复制到Consolidated目录
  2. 通过命令提示符命令将所选文件转换为.csv文件[C:\ CommissionRecon \ ConvertExcel \ ConvertExcelTo.exe ^ xxxxx.xls ^ xxxx.csv]
  3. 使用命令提示符将所有.csv文件合并到1个csv文件中 [.csv文件位置:复制* .csv ^ filename.csv]
  4. 执行此控制台应用程序的语法是否正确?

    请检查以下代码并推荐一些修复程序。我包含了很多代码,以便您可以获得全局,但我主要是希望您在可能的情况下查看私有void sourceFiles_Click方法。

    谢谢!

    以下是MainForm.CS文件中的代码:

        // Select Source Files Button 
        private void sourceFiles_Click(object sender, EventArgs e)
        {
            Stream myStream = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
    
            this.sourceFileOpenFileDialog.InitialDirectory = "i:\\CommissisionReconciliation\\Review\\";
            this.sourceFileOpenFileDialog.Filter = "Excel Files (*.xls;*.xlsx;)|*.xls;*.xlsx;|All Files (*.*)|*.*";
            this.sourceFileOpenFileDialog.FilterIndex = 2;
            this.sourceFileOpenFileDialog.RestoreDirectory = true;
            this.sourceFileOpenFileDialog.Multiselect = true;
            this.sourceFileOpenFileDialog.Title = "Excel File Browser";
    
            DialogResult dr = this.sourceFileOpenFileDialog.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                string consolidatedFolder = targetFolderBrowserDialog.SelectedPath; 
                // Read the files
                foreach (String file in sourceFileOpenFileDialog.FileNames)
                {
                    try
                    {
                        // Copy each selected xlsx files into the specified TargetFolder 
    
                        System.IO.File.Copy(fileName, consolidatedFolder + @"\" + System.IO.Path.GetFileName(fileName)); 
    
                        // Convert each selected XLSX File to CSV Using the command prompt
                        // [I:\CommissisionReconciliation\App\ConvertExcel\ConvertExcelTo.exe ^ .XLS file location ^ filename.csv] 
                        // example: ConvertExcelTo.exe ^ I:\CommissisionReconciliation\ Review\_Consolidated\ALH\2011-350-00-600070-
                        // 03-09alh-AMLHS of Florida.xlsx ^ 2011-350-00-600070-03-09alh-AMLHS of Florida.csv
    
                        Process covertFilesProcess = new Process();
    
                        covertFilesProcess.StartInfo.WorkingDirectory = "I:\\CommissisionReconciliation\\App\\ConvertExcel\\";
                        covertFilesProcess.StartInfo.FileName = sourceFileOpenFileDialog.FileName; 
                        covertFilesProcess.StartInfo.Arguments = "ConvertExcelTo.exe" + " ^ " + targetFolderBrowserDialog.SelectedPath + "^" + sourceFileOpenFileDialog.FileName + ".csv";
                        covertFilesProcess.StartInfo.UseShellExecute = false;
                        covertFilesProcess.StartInfo.CreateNoWindow = true;
                        covertFilesProcess.StartInfo.RedirectStandardOutput = true;
                        covertFilesProcess.StartInfo.RedirectStandardError = true;
                        covertFilesProcess.Start();
    
                        StreamReader sOut = covertFilesProcess.StandardOutput;
                        StreamReader sErr = covertFilesProcess.StandardError;
    
                    }
    
                    catch (SecurityException ex)
                    {
                        // The user lacks appropriate permissions to read files, discover paths, etc.
                        MessageBox.Show("Security error. The user lacks appropriate permissions to read files, discover paths, etc. Please contact your administrator for details.\n\n" +
                        "Error message: " + ex.Message + "\n\n" +);
                    }
                    catch (Exception ex)
                    {
                        // Could not load the image - probably related to Windows file system permissions.
                        MessageBox.Show("Cannot display the image: " + file.Substring(file.LastIndexOf('\\'))
                         + ". You may not have permission to read the file, or " +
                         "it may be corrupt.\n\nReported error: " + ex.Message);
                    }
    
                    finally
                    {
                        sOut.Close();
                        sErr.Close();
                    }
    
                    try
                    {
                        // Combine all .csv files into 1 csv file using the command prompt
                        // [.csv File location: Copy *.csv ^ filename.csv]
                        // example: [.CSV I:\CommissisionReconciliation\ Review\_Consolidated\ALH\: Copy *.csv 
                        // ^2011-350-00-600070-03-09alh-AMLHS of Florida.csv)
    
                        Process consolidateFilesProcess = new Process();
    
                        // substring function to take off the extension from sourceFileOpenFileDialog.FileName
                        // int csvFileName.Length = sourceFileOpenFileDialog.FileName.Length - 3;  
    
                        consolidateFilesProcess.StartInfo.WorkingDirectory = "I:\\CommissisionReconciliation\\App\\ConvertExcel\\";
                        consolidateFilesProcess.StartInfo.FileName = sourceFileOpenFileDialog.FileName; 
                        consolidateFilesProcess.StartInfo.Arguments = ".CSV " + " ^ " + targetFolderBrowserDialog.SelectedPath + ": Copy *.csv ^" + csvFileName+ ".csv";
                        consolidateFilesProcess.StartInfo.UseShellExecute = false;
                        consolidateFilesProcess.StartInfo.CreateNoWindow = true;
                        consolidateFilesProcess.StartInfo.RedirectStandardOutput = true;
                        consolidateFilesProcess.StartInfo.RedirectStandardError = true;
                        consolidateFilesProcess.Start();
    
                        StreamReader sOut = consolidateFilesProcess.StandardOutput;
                        StreamReader sErr = consolidateFilesProcess.StandardError;
                    }
    
                    catch (SecurityException ex)
                    {
                        // The user lacks appropriate permissions to read files, discover paths, etc.
                        MessageBox.Show("Security error. The user lacks appropriate permissions to read files, discover paths, etc. Please contact your administrator for details.\n\n" +
                        "Error message: " + ex.Message + "\n\n" +);
                    }
                    catch (Exception ex)
                    {
                        // Could not load the image - probably related to Windows file system permissions.
                        MessageBox.Show("Cannot display the image: " + file.Substring(file.LastIndexOf('\\'))
                         + ". You may not have permission to read the file, or " +
                         "it may be corrupt.\n\nReported error: " + ex.Message);
                    }
    
                    finally
                    {
                        sOut.Close();
                        sErr.Close();
                    }
    
                } // ends foreach (String file in openFileDialog1.FileNames)
            }  // ends if (dr == System.Windows.Forms.DialogResult.OK)
        } // ends selectFilesButton_Click method 
    
            if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((myStream = sourceFileOpenFileDialog.OpenFile()) != null)
                    {
                        using (myStream)
                        {
                            textBoxSourceFiles.Text = sourceFileOpenFileDialog.FileNames;
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
            }
    
            if (sourceFileOpenFileDialog.ShowDialog() == DialogResult.OK)
            {
                Log("Source Files: " + sourceFileOpenFileDialog.SelectedFiles);
            }
            textBoxSourceFiles.Text = sourceFileOpenFileDialog.SelectedFiles;
        }
    

2 个答案:

答案 0 :(得分:1)

创建ProcessSTartInfo时,需要指定要作为文件名运行的进程的可执行文件!

例如:

Process covertFilesProcess = new Process();

covertFilesProcess.StartInfo.WorkingDirectory = "I:\\CommissisionReconciliation\\App\\ConvertExcel\\";
covertFilesProcess.StartInfo.FileName = "ConvertExcelTo.exe";
covertFilesProcess.StartInfo.Arguments = "^ " + targetFolderBrowserDialog.SelectedPath + "^" + sourceFileOpenFileDialog.FileName + ".csv";
covertFilesProcess.StartInfo.UseShellExecute = true;
covertFilesProcess.StartInfo.CreateNoWindow = true;
covertFilesProcess.StartInfo.RedirectStandardOutput = true;
covertFilesProcess.StartInfo.RedirectStandardError = true;
covertFilesProcess.Start();

StreamReader sOut = covertFilesProcess.StandardOutput;
StreamReader sErr = covertFilesProcess.StandardError;

答案 1 :(得分:1)

首先要做的事情:

try
{
    ...
    StreamReader sOut = covertFilesProcess.StandardOutput;
}
sOut.close();

sOut在try块中声明 - 它在外面不可见。你需要把它移到外面这个

StreamReader sOut = null;
try
{
    ...
    sOut = covertFilesProcess.StandardOutput;
}

if (sOut != null) sOut.Close();

与sErr相同

更新:对于SecurityException,您需要使用System.Security添加,而对于您需要使用System.Diagnostics添加的Process。并且未声明变量fileName - 因此编译器不知道它是什么。