2017-09-17 1 views
0

Excelのファイルをマージし、ListBox内のファイルを個別に読み込むのに問題がある単純なプログラムを作成しようとしています。文書をマージする

ユーザーはListBoxに表示される複数のファイルを選択できます。マージをクリックすると、横にあるTextBoxに指定された名前で新しいファイルが生成されます。

私の問題は、ListBoxからマージするファイルを読み込むときです。

btnMergeFile_Click(object sender, RoutedEventArgs e) 
    { 
     Workbook workbook = new Workbook(); 
     workbook.LoadFromFile(@"filename.xlsx"); 
     Workbook workbook2 = new Workbook(); 
     workbook2.LoadFromFile(@"filename.xlsx"); 
    } 

リスト名を個別に呼び出すことはできますか?

私はc#とwpfを初めて使いました。

XAML

<DockPanel Margin="10"> 
     <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10"> 
      <Button x:Name="btnSelectFile" Width="75" Height="30" Margin="5" Click="btnSelectFile_Click">Select Files</Button> 
      <Button x:Name="btnMergeFile" Width="75" Height="30" Margin="5" Click="btnMergeFile_Click">Merge Files</Button> 
      <Button x:Name="btnClearFile" Width="75" Height="30" Margin="5" Click="btnClearFile_Click">Clear Files</Button> 
      <TextBox x:Name="newFileName" TextAlignment="Left" HorizontalAlignment="Center" Width="150" Text="New File Name"/> 
     </WrapPanel> 
     <ListBox x:Name="listBox1" /> 
    </DockPanel> 

</Grid> 

.CS

using System; 
using System.Windows; 
using Microsoft.Win32; 
using System.Data; 
using Spire.Xls; 

namespace ExcelMerge_1._1 
{ 

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void btnSelectFile_Click(object sender, RoutedEventArgs e) 
    { 
     OpenFileDialog openFileDialog = new OpenFileDialog(); 
     openFileDialog.Multiselect = true; 
     openFileDialog.Filter = "csv files (*.csv)|*.csv|Excel files (*.XLSX)|*.XLSX"; 
     openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

     if (openFileDialog.ShowDialog() == true) 
     { 
      foreach (string filename in openFileDialog.FileNames) 

       listBox1.Items.Add(System.IO.Path.GetFullPath(filename)); 
     } 

    } 



    public void btnMergeFile_Click(object sender, RoutedEventArgs e) 
    { 
     Workbook workbook = new Workbook(); 
     workbook.LoadFromFile(@"filename.xlsx"); 
     Workbook workbook2 = new Workbook(); 
     workbook2.LoadFromFile(@"filename.xlsx"); 


     Worksheet sheet2 = workbook2.Worksheets[0]; 
     DataTable dataTable = sheet2.ExportDataTable(); 
     Worksheet sheet1 = workbook.Worksheets[0]; 
     sheet1.InsertDataTable(dataTable, false, sheet1.LastRow + 1, 1); 

     workbook.SaveAsXml(newFileName.Text); 
    } 

    private void btnClearFile_Click(object sender, RoutedEventArgs e) 
    { 
     listBox1.Items.Clear(); 
    } 
} 
} 

答えて

0

まず、リストボックスの選択モードをNixonUposseenのように複数設定する必要があります。

第2に、以下のようにコードを使用して、選択したExcelファイルとCSVファイルをマージします。私はすでにそれを試して、それは私の側でうまくいった。

using System; 
using System.Windows; 
using Microsoft.Win32; 
using Spire.Xls; 
using System.IO; 

namespace MergeExcel 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     }   

     private void btnSelectFile_Click(object sender, RoutedEventArgs e) 
     { 
      OpenFileDialog openFileDialog1 = new OpenFileDialog(); 
      openFileDialog1.Multiselect = true; 
      openFileDialog1.Title = "Select Files"; 
      openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
      openFileDialog1.Filter = "Files(*.xls;*.xlsx;*.csv)|*.xls;*.xlsx;*.csv";    
      openFileDialog1.FilterIndex = 1; 
      openFileDialog1.RestoreDirectory = true; 
      //openFileDialog1.CheckFileExists = true; 
      //openFileDialog1.CheckPathExists = true; 

      if (openFileDialog1.ShowDialog() == true) 
      { 
       foreach (string filename in openFileDialog1.FileNames) 
       { 

        listBox1.Items.Add(System.IO.Path.GetFullPath(filename)); 
       } 
      } 
     } 

     private void btnMergeFile_Click(object sender, RoutedEventArgs e) 
     { 
      Workbook tempbook = new Workbook(); 

      Workbook workbook = new Workbook(); 
      workbook.Version = ExcelVersion.Version2013; 
      workbook.Worksheets.Clear(); 


      foreach (string file in listBox1.SelectedItems) 
      { 
       string extension = Path.GetExtension(file); 
       if (extension == ".xlsx" | extension == ".xls") 
       { 
        tempbook.LoadFromFile(file);//Load Excel files 
       } 
       else 
       { 
        tempbook.LoadFromFile(file, ",", 1, 1);//Load CSV files      
       } 
       foreach (Worksheet sheet in tempbook.Worksheets) 
       { 
        workbook.Worksheets.AddCopy(sheet);//Merge files 
       } 
      } 
      string newFileName = textBox1.Text.Trim(); 
      workbook.SaveToFile(newFileName); 
     }  

    } 
} 
0

私はあなたが同じコレクションを使用することができますので、あなただけ、あなたが以前にリストボックスに追加された項目を取得する必要があると思いますアイテムを追加するときに使用しました:

foreach(var fileName in listBox1.Items) 
{ 
    Workbook workbook = new Workbook(); 
    workbook.LoadFromFile(fileName); 
} 

しかし、初心者として、このシナリオでは役に立ちますが、コードを論理的に構造化したままにするMVVMアーキテクチャについてお読みください。また、あなたがListBox.SelectedItemsコレクションを使用して、それらの選択したファイルを反復処理します

<ListBox x:Name="listBox1" SelectionMode="Multiple" /> 

:あなたは、ユーザーが複数のファイルを選択できることを述べたので、私はあなたがこれを必要とすると信じて MVVM: Tutorial from start to finish?

0

:あなたは、この他の質問を見ることができます。
はまたここにあなたが試すことができ、完全なbtnMergeFile_Clickイベントです:

private void btnMergeFile_Click(object sender, RoutedEventArgs e) 
{ 
    ExcelFile workbook = new ExcelFile(); 

    // Copy all sheets into a resulting ExcelFile. 
    foreach (string file in this.listBox1.SelectedItems) 
    { 
     ExcelFile temp = ExcelFile.Load(file); 
     foreach (ExcelWorksheet sheet in temp.Worksheets) 
      workbook.Worksheets.AddCopy(
       // Unique sheet name. 
       string.Format("{0} - {1}", System.IO.Path.GetFileNameWithoutExtension(file), sheet.Name), 
       // Sheet object. 
       sheet); 
    } 

    // Save ExcelFile. 
    workbook.Save(this.newFileName.Text); 
} 

注意が、私が選択したExcelファイルをマージするGemBox.Spreadsheetを使用しました。

関連する問題