tag:crieit.net,2005:https://crieit.net/tags/CSV%E5%87%BA%E5%8A%9B/feed
「CSV出力」の記事 - Crieit
Crieitでタグ「CSV出力」に投稿された最近の記事
2019-03-28T10:25:20+09:00
https://crieit.net/tags/CSV%E5%87%BA%E5%8A%9B/feed
tag:crieit.net,2005:PublicArticle/14888
2019-03-28T10:22:34+09:00
2019-03-28T10:25:20+09:00
https://crieit.net/posts/WPF-DataGrid-SaveFileDialog-CSV
【WPF】DataGridの内容をSaveFileDialogを使ってCSVファイルに出力する
<p>おはようございます。</p>
<p>前回、CSVファイルの読み込みをやったので今回はファイル出力をやってみます。</p>
<p>プログラムは例によって前回までのものを使います。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/06/29/post-1354/" target="_blank" rel="noopener" data-blogcard="1">【WPF】TextFieldParser で CSVファイルを読み込む</a></p>
<h2 id="画面の変更"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%A4%89%E6%9B%B4">画面の変更</a></h2>
<p>画面に「CSV出力」ボタンを追加します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/06/outputCsv000.jpg" alt="image" /></p>
<p>MainWindow.xaml</p>
<p>次の記述を追加します。</p>
<pre><code class="xml"><Button x:Name="exp_button" Content="CSV出力" HorizontalAlignment="Left" Margin="330,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="exp_button_Click"/>
</code></pre>
<p>全体</p>
<pre><code class="xml"><Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="一覧" Height="350" Width="530">
<Window.Resources>
<ResourceDictionary Source="/Style/StyleDic.xaml"/>
</Window.Resources>
<Grid>
<Grid.Resources>
<local:KindConverter x:Key="KindConv"/>
</Grid.Resources>
<Label Content="名前:" Margin="10,10,0,0" Style="{StaticResource lb-normal}"/>
<TextBox x:Name="search_name" Margin="56,12,0,0" Style="{StaticResource tx-normal}"/>
<Label Content="種別:" Margin="201,10,0,0" Style="{StaticResource lb-normal}"/>
<ComboBox x:Name="search_kind" Margin="252,12,0,0" Style="{StaticResource cb-normal}"/>
<Button x:Name="search_button" Content="検索" Margin="432,12,0,0" Style="{StaticResource btn-normal}" Click="search_button_Click"/>
<DataGrid Name="dataGrid" HorizontalAlignment="Left" Margin="10,43,0,0" Width="497" Height="225" Style="{StaticResource grid-normal}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding No}" ClipboardContentBinding="{x:Null}" Header="No" IsReadOnly="True" Width="50"/>
<DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="名前" IsReadOnly="True" Width="100"/>
<DataGridTextColumn Binding="{Binding Sex}" ClipboardContentBinding="{x:Null}" Header="性別" IsReadOnly="True" Width="40"/>
<DataGridTextColumn Binding="{Binding Age}" ClipboardContentBinding="{x:Null}" Header="年齢" IsReadOnly="True" Width="40"/>
<DataGridTextColumn Binding="{Binding Kind, Converter={StaticResource KindConv<span>}</span><span>}</span>" ClipboardContentBinding="{x:Null}" Header="種別" IsReadOnly="True" Width="120"/>
<DataGridTextColumn Binding="{Binding Favorite}" ClipboardContentBinding="{x:Null}" Header="好物" IsReadOnly="True" Width="*"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="add_button" Content="追加" HorizontalAlignment="Left" Margin="10,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="add_button_Click"/>
<Button x:Name="upd_button" Content="更新" HorizontalAlignment="Left" Margin="90,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="upd_button_Click"/>
<Button x:Name="del_button" Content="削除" HorizontalAlignment="Left" Margin="170,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="del_button_Click"/>
<Button x:Name="imp_button" Content="CSV読込" HorizontalAlignment="Left" Margin="250,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="imp_button_Click"/>
<Button x:Name="exp_button" Content="CSV出力" HorizontalAlignment="Left" Margin="330,273,0,0" VerticalAlignment="Top" Width="75" Height="30" Click="exp_button_Click"/>
</Grid>
</Window>
</code></pre>
<h3 id="ライブラリの使用宣言を追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%BF%E7%94%A8%E5%AE%A3%E8%A8%80%E3%82%92%E8%BF%BD%E5%8A%A0">ライブラリの使用宣言を追加</a></h3>
<p>次の記述を追加します。</p>
<p>MainWindow.xaml.cs</p>
<pre><code>using System.IO;
using Microsoft.Win32;
</code></pre>
<p>SaveFileDialogを利用するためのライブラリとなります。</p>
<h2 id="クリックイベントの追加"><a href="#%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">クリックイベントの追加</a></h2>
<p>CSV出力ボタンがクリックされた際のイベントを追加し、ファイルの出力処理を記述します。</p>
<p>MainWindows.xaml.cs</p>
<pre><code> /// <summary>
/// CSV出力ボタンクリックイベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void exp_button_Click(object sender, RoutedEventArgs e)
{
// ファイル保存ダイアログ
SaveFileDialog dlg = new SaveFileDialog();
// デフォルトファイル名
dlg.FileName = "cat.csv";
// デフォルトディレクトリ
dlg.InitialDirectory = @"c:\";
// ファイルのフィルタ
dlg.Filter = "CSVファイル|*.csv|すべてのファイル|*.*";
// ファイルの種類
dlg.FilterIndex = 0;
// 指定されたファイル名を取得
if (dlg.ShowDialog() == true)
{
List<Cat> list = this.dataGrid.ItemsSource as List<Cat>;
String delmiter = ",";
StringBuilder sb = new StringBuilder();
Cat lastData = list.Last();
foreach (Cat cat in list)
{
sb.Append(cat.No).Append(delmiter);
sb.Append(cat.Name).Append(delmiter);
sb.Append(cat.Sex).Append(delmiter);
sb.Append(cat.Age).Append(delmiter);
sb.Append(cat.Kind).Append(delmiter);
sb.Append(cat.Favorite);
if (!cat.Equals(lastData))
{
sb.Append(Environment.NewLine);
}
}
Stream st = dlg.OpenFile();
StreamWriter sw = new StreamWriter(st, Encoding.GetEncoding("UTF-8"));
sw.Write(sb.ToString());
sw.Close();
st.Close();
MessageBox.Show("CSVファイルを出力しました。");
}
else
{
MessageBox.Show("キャンセルされました。");
}
}
</code></pre>
<h2 id="CSV出力してみる"><a href="#CSV%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">CSV出力してみる</a></h2>
<p>修正後の画面を起動し、CSV出力ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/06/outputCsv001.jpg" alt="image" /></p>
<p>ファイル保存ダイアログが表示されます。<br />
プログラム内で設定したデフォルトのファイル名や、ファイルの種類がちゃんと表示されていますね。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/06/outputCsv002.jpg" alt="image" /></p>
<p>正常に出力が完了しました。<br />
またまたあっさり終わっちゃいましたね。</p>
<p>次回はインストーラーの作成なんかやってみようかと思います。</p>
<p>ではでは。</p>
doraxdora