🕙

AIを使ってOfficeソフト/PDF/テキストをまとめて横断検索できるアプリを作った

に公開

動機

世の中にはGrepツールが色々ありますが、テキストファイルのみを対象にしていたり、Excelを対象にした場合は図形オブジェクトを対象にしていなかったりして、使い勝手がいまひとつのものが多いです。また、大体はxdoc2txtに依存しています。xdoc2txtは良いソフトですが、なくてもgrepはできますし、実装も可能です(AIが)。そこで、図形 も検索できるGrepツールを作り、ついでにMicrosoft Storeで公開することにしました。

Office や PDF もまとめて検索したい

開発の設計書は大体がExcelやWordで書かれています。影響度調査はソースコードだけでなく設計書でも実施すべきです。ただ、プロジェクトフォルダーにある様々な形式のファイルがあり、探しづらいです。そこでGrepツールを探してみると意外にもOfficeソフトを対象にしたツールは少なく、さらに図形を含めているものはかなり少なかったです。それもPDFなども対象にするとなると見つけられませんでした。

そこで作ったのが、Windows デスクトップアプリの WizGrep です。

WizGrep は、Excel・Word・PowerPoint・PDF・テキストファイルをまとめて全文検索できるローカル検索アプリです。指定フォルダ配下を再帰的に走査し、ヒットしたファイルと一致箇所を一覧表示できます。

WinUi3

WinUi3はWPF、UWPに続き、Windowsデスクトップアプリを作るフレームワークです。
実際使ってみると色々まだまだという感じです。WPFから退化してる部分もあるし、ちょっと残念ぎみ。しかも普通に実行するとWindows Store前提の構成になり、自分でプロジェクトファイルを編集する必要があります。そのあたりなんとかしてほしいなということろ。

・WinUi3アプリの良いところ
  設定ファイルの操作が簡単。

    private ApplicationDataContainer LocalSettings
    {
        get
        {
            field ??= ApplicationData.Current.LocalSettings;
            return field;
        }
    }

ApplicationDataContainerクラスを使用できる。

・つまづきポイント
  ファイル保存ダイアログ
  これは混乱のもと。古いAPIは権限周りにバグがある。
 今はこちらを使うべき。

using Microsoft.Windows.Storage.Pickers;
    private async Task ExportToFileAsync(string content, string suggestedFileName)
    {
        try
        {
            var picker = new FileSavePicker(AppWindow.Id)
            {
                SuggestedStartLocation = PickerLocationId.Desktop
            };
            picker.FileTypeChoices.Add($"{ResourceLoaderHelper.GetString("TextFileLabel")}", new List<string> { ".txt" });
            
            var pickResult = await picker.PickSaveFileAsync();
                if (pickResult != null && !string.IsNullOrEmpty(pickResult.Path))
                {
                    var file = await StorageFile.GetFileFromPathAsync(pickResult.Path);
                    await FileIO.WriteTextAsync(file, content);
                }
        }
        catch (Exception ex)
        {
            LoggerHelper.Instance.LogError($"Error exporting to file: {ex.StackTrace}");
            await ShowErrorDialogAsync($"{ResourceLoaderHelper.GetString("ErrorMessage_ExportFile")}", ex.StackTrace);
        }
    }

AIも間違ったほうを使ってきます。手で直すか指示するかしましょう。

公開情報

公開中のアプリはこちら。
https://apps.microsoft.com/detail/9NX1F5ZBLZCS?hl=ja-jp&gl=JP&ocid=pdpshare

ソースコードも公開しています。
https://github.com/KoMMet/WizGrep

使い方
https://kommet.github.io/WizGrep/

その他

Microsoft Storeで公開するにも情報が少なく古いものも多く、つまづきポイントもあったので、またZennで公開します。

Discussion