前回のサーチコンソールのレポート 自分のブログが検索されたときの順位を取得するの続きです。
前回作成したアプリではキーワードごとに新しいシートを作成していたのでちょっと見づらいです。そこで以下のような表示になるようにつくりかえます。

今回は取得できる件数の上限を設定できるようにする、ラジオボタンで
検索結果に多く表示されてキーワード順
実際にクリックされているキーワード順
上位表示されているキーワード順
に並べ替えて出力できるようにします。
それからニッチなキーワードになると検索されない日もあります。そのような場合は表示回数は0、クリックと順位は「-」を表示させます。

ではさっそくはじめてみましょう。
まずExcelファイルを操作するのでNugetでClosedXMLをインストールしておいてください。
デザイナでラジオボタンとNumericUpDownコントロールを追加しました。

前回のサーチコンソールのレポート 自分のブログが検索されたときの順位を取得するとの変更箇所のみ示します。
まず、コンストラクタ内でラジオボタンとNumericUpDownコントロールの初期化をおこないます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public partial class Form1 : Form {     public Form1()     {         InitializeComponent();         AllowDrop = true;         radioBtnDisplayed.Checked = true;         numericUpDown1.Minimum = 1;         numericUpDown1.Maximum = 1000;         numericUpDown1.Value = 10;     } } | 
ファイルがドロップされたらラジオボタンの状態をみてデータを何の順にならべるかを調べます。そして例えば表示回数が多い順にデータを出力させたいのであれば自作メソッドのGetDisplayedKeyWordInfosを呼びます。
それからcsvファイルのレポートが何日のものかを調べて過去のものから順番に出力できるように、自作メソッドのGetDateListで日付のリストを生成しています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public partial class Form1 : Form {     protected override void OnDragDrop(DragEventArgs drgevent)     {         if (drgevent.Data.GetDataPresent(DataFormats.FileDrop))         {             string[] files = (string[]) drgevent.Data.GetData(DataFormats.FileDrop);             List<Data> datas = GetDataFromExcelFiles(files);             List<KeyWordInfo> keyWordInfos;             string title;             if (radioBtnDisplayed.Checked)             {                 keyWordInfos = GetDisplayedKeyWordInfos(datas);                 title = "表示回数が多い順";             }             else if (radioBtnClicked.Checked)             {                 keyWordInfos = GetClickedKeyWordInfos(datas);                 title = "クリック数が多い順";             }             else // if (radioBtnRanking.Checked)             {                 keyWordInfos = GetRankingKeyWordInfos(datas);                 title = "上位表示されている順";             }             List<DateTime> dateTimes = GetDateList(datas).OrderBy(x=> x).ToList();             int count = (int)numericUpDown1.Value;             if (keyWordInfos.Count > count)                 keyWordInfos = keyWordInfos.Take(count).ToList();             SaveFileDialog dialog = new SaveFileDialog();             dialog.Filter = "Excel(*.xlsx)|*.xlsx";             if (dialog.ShowDialog() == DialogResult.OK)             {                 SaveExcel(dialog.FileName, title, keyWordInfos, dateTimes);                 MessageBox.Show("終了しました");             }             dialog.Dispose();         }         base.OnDragDrop(drgevent);     } } | 
GetDateListメソッドを示します。Dataオブジェクトのリストから日付を取得してそのリストを生成しているだけです。そして過去のものから順番に並べ替えて結果を返します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | public partial class Form1 : Form {     List<DateTime> GetDateList(List<Data> datas)     {         List<DateTime> dts = new List<DateTime>();         foreach (Data data in datas)         {             if (!dts.Any(x => x == data.DateTime))                 dts.Add(data.DateTime);         }         return dts.OrderBy(x => x).ToList();     } } | 
Excelファイルに書き込む内容が変更されたのでSaveExcelメソッドは引数もあわせて変更になります。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | using ClosedXML.Excel; public partial class Form1 : Form {     void SaveExcel(string excelPath, string title, List<KeyWordInfo> keyWordInfos, List<DateTime> dateTimes)     {         using (XLWorkbook workbook = new XLWorkbook())         {             IXLWorksheet worksheet = workbook.Worksheets.Add("シート1");             // 何の結果が出力されているのを表示する             worksheet.Range("A1:Z1").Merge();             worksheet.Cell(1, 1).Value = title;             int row = 3;             foreach (KeyWordInfo info in keyWordInfos)             {                 // セルにキーワードを表示する。キーワードは横幅をとるので複数セルを結合させる                 SetCellKeyWord(worksheet, row, info.KeyWord);                 worksheet.Cell(row + 2, "A").Value = "月日";                 worksheet.Cell(row + 3, "A").Value = "表示回数";                 worksheet.Cell(row + 4, "A").Value = "クリック数";                 worksheet.Cell(row + 5, "A").Value = "掲載順位";                 int i = 2;                 foreach (DateTime dt in dateTimes)                 {                     Data data = info.Datas.FirstOrDefault(x => x.DateTime == dt);                     IXLCell dateCell = worksheet.Cell(row + 2, i);                     IXLCell displayedCountCell = worksheet.Cell(row + 3, i);                     IXLCell clickedCountCell = worksheet.Cell(row + 4, i);                     IXLCell rakingCountCell = worksheet.Cell(row + 5, i);                     // セル内の文字を中央寄せにする                     AlignmentHorizontal(dateCell);                     AlignmentHorizontal(displayedCountCell);                     AlignmentHorizontal(clickedCountCell);                     AlignmentHorizontal(rakingCountCell);                     dateCell.SetValue<string>(dt.ToString("MM/dd"));                     if (data != null)                     {                         displayedCountCell.Value = data.DisplayedCount.ToString();                         clickedCountCell.Value = data.ClickedCount.ToString();                         rakingCountCell.Value = data.Ranking.ToString();                     }                     else {                         // 日付が存在しない場合は                         // その日はそのキーワードは検索されなかったとみなして「0」「-」を表示する                         displayedCountCell.Value = 0;                         clickedCountCell.Value = "-";                         rakingCountCell.Value = "-";                     }                     i++;                 }                 // 次の項目とのあいだに空白行を2行入れる。                 row += 8;             }             worksheet.ColumnsUsed().AdjustToContents();             workbook.SaveAs(excelPath);         }     } } | 
セル内の文字を中央寄せにするメソッドとキーワードが入るセルにキーワードをセットするメソッドを示します。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public partial class Form1 : Form {     void AlignmentHorizontal(IXLCell cell)     {         cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;     }     void SetCellKeyWord(IXLWorksheet worksheet, int row, string keyword)     {         // セルにキーワードを表示する。キーワードは横幅をとるので複数セルを結合させる         // 背景を黄色にして目立つようにする         string cellAdress = String.Format("A{0}:B{0}", row);         worksheet.Range(cellAdress).Merge();         worksheet.Cell(row, "A").Value = "キーワード";         worksheet.Cell(row, "A").Style.Fill.BackgroundColor = XLColor.Yellow;         cellAdress = String.Format("C{0}:Z{0}", row);         worksheet.Range(cellAdress).Merge();         worksheet.Cell(row, "C").Value = keyword;         worksheet.Cell(row, "C").Style.Font.Bold = true;         worksheet.Cell(row, "C").Style.Fill.BackgroundColor = XLColor.Yellow;     } } | 
