C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

csvファイルを印刷したい

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■98776 / inTopicNo.1)  csvファイルを印刷したい
  
□投稿者/ 高校生 (1回)-(2021/12/22(Wed) 21:43:05)

分類:[C#] 

csvファイル(ここではdata.csvとします)をそのまま印刷するプログラムを作成したいです。
ネットで調べても画像の印刷しか出てこず、よくわからなかったので、教えていただけますでしょうか。
引用返信 編集キー/
■98779 / inTopicNo.2)  Re[1]: csvファイルを印刷したい
□投稿者/ くま (103回)-(2021/12/22(Wed) 23:14:18)
> csvファイル(ここではdata.csvとします)をそのまま印刷するプログラム
この「そのまま」が本当にそれでいいの?という話がありますが

印刷するのは一度画像に変換する必要があります

まずは単純に画像を印刷する方法
印刷する
https://dobon.net/vb/dotnet/graphics/printdocument.html

で、「csvファイルをそのまま画像にする方法」は
CSVファイルを読み込んでテキストボックスで表示

フォームやコントロールの外観をキャプチャする
https://dobon.net/vb/dotnet/graphics/invokepaint.html

この方法で対象のテキストボックスの画像を取得します。

ただ改ページだったり、行全体が表示されているかだったりを考慮しないといけないので
めんどくさかったりします。

Excelとか入っているんなら一度CSVをExcelで表示させて印刷させるようにした方が早いかも。
もう一つは...ちょっと調べます。

引用返信 編集キー/
■98783 / inTopicNo.3)  Re[2]: csvファイルを印刷したい
□投稿者/ くま (107回)-(2021/12/23(Thu) 01:51:39)
2021/12/23(Thu) 02:03:18 編集(投稿者)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim path As String = "D:\TEST\TestCSV.CSV" '対象ファイル
        Dim lines As List(Of String) = New List(Of String)
        Dim line As String
        Dim items() As String
        'ファイルをutf-8コードとして開く
        Using sr As New System.IO.StreamReader(path, System.Text.Encoding.GetEncoding("utf-8"))
            While sr.Peek() > -1
                line = sr.ReadLine()
                If line.Length > 0 Then
                    items = line.Split(",")
                    line = ""
                    For Each item As String In items
                        line &= "<td style=""white-space: nowrap;padding:0 5px;"">" & item & "</td>"
                    Next
                    line = "<tr>" & line & "</tr>"
                    lines.Add(line)
                End If
            End While
        End Using

        Dim sauce As String = ""
        sauce = "<table border=""0"" cellspacing=""0"" cellpadding=""0"" bordercolor=""#ffffff"">" & Strings.Join(lines.ToArray) & "</table>"
        sauce = "<html><body style=""margin:0;padding:0;"">" & sauce & "</body></html>"

        Dim webBrowserForPrinting As New WebBrowser()
        webBrowserForPrinting.Parent = Me
        webBrowserForPrinting.Visible = False
        AddHandler webBrowserForPrinting.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PrintDocument)
        webBrowserForPrinting.DocumentText = sauce

    End Sub
    Private Sub PrintDocument(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
        Dim webBrowserForPrinting As WebBrowser = CType(sender, WebBrowser)
        webBrowserForPrinting.ShowPrintPreviewDialog()
    End Sub

引用返信 編集キー/
■98784 / inTopicNo.4)  Re[3]: csvファイルを印刷したい
□投稿者/ くま (108回)-(2021/12/23(Thu) 01:56:08)
方法: WebBrowser コントロールを使用して印刷する
https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/controls/how-to-print-with-a-webbrowser-control?view=netframeworkdesktop-4.8

1. csvファイルをhtml形式に変換
2. WebBrowserで表示
3. 印刷プレビューを表示

html形式に変換する際、書式等を変更する事も可能ですし
プレビュー無しで印刷する事も可能

あとcsvで「123,"あ,い",456」などの対応はしていません。
必要なら処理入れてください。
引用返信 編集キー/
■98802 / inTopicNo.5)  Re[3]: csvファイルを印刷したい
□投稿者/ 魔界の仮面弁士 (3266回)-(2021/12/23(Thu) 17:06:35)
No98783 (くま さん) に返信
> Dim sauce As String = ""
source では無いのですね。

くまさんの WebBrowser による印刷サンプルは VB のコードですが、
元が C# の質問なので、C# 版を投稿してみます。

今回は csv → HTML 変換には ACE 12.0 / 16.0 を使ってみたので、
データの区切りではなく、データそのものにカンマや改行を含む CSV ファイルにも
対応できるようになっています。
(その代わり、列の名前やデータ型を調整する場合は schema.ini が必要になります)


private void button1_Click(object sender, EventArgs e)
{
  string csvFile = @"D:\TEST\Example.csv";
  bool csvHeader = true;

  string outHTML = @"D:\TEST\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".html";

  var cb = new System.Data.OleDb.OleDbConnectionStringBuilder();
  cb.Provider = "Microsoft.ACE.OLEDB.12.0";
  cb["Extended Properties"] = "Text; FMT=CSVDelimited; HDR=" + (csvHeader ? "YES" : "NO");
  cb.DataSource = System.IO.Path.GetDirectoryName(csvFile);
  using (var cn = new System.Data.OleDb.OleDbConnection(cb.ConnectionString))
  using (var cmd = cn.CreateCommand())
  {
    cn.Open();

    cmd.CommandText = String.Format(
      "SELECT * INTO [{1}] IN \"{0}\" [HTML Export;] FROM [{2}]",
      System.IO.Path.GetDirectoryName(outHTML),
      System.IO.Path.GetFileName(outHTML),
      System.IO.Path.GetFileName(csvFile));

    cmd.ExecuteNonQuery();
    cn.Close();
  }
  WebBrowserDocumentCompletedEventHandler handler = default;
  handler = (o, a) => {
    webBrowser1.DocumentCompleted -= handler;
    // webBrowser1.ShowPrintDialog();
    webBrowser1.ShowPrintPreviewDialog();
  };
  webBrowser1.DocumentCompleted += handler;
  webBrowser1.Navigate(outHTML);
}
引用返信 編集キー/
■98808 / inTopicNo.6)  Re[4]: csvファイルを印刷したい
□投稿者/ くま (117回)-(2021/12/23(Thu) 22:14:57)
No98802 (魔界の仮面弁士 さん) に返信
訂正ありがとうございます。
>> Dim sauce As String = ""
>source では無いのですね。
htmlのほうが良かったですかね...。
引用返信 編集キー/
■98811 / inTopicNo.7)  Re[1]: csvファイルを印刷したい
□投稿者/ WebSurfer (2392回)-(2021/12/24(Fri) 09:12:49)
No98776 (高校生 さん) に返信
> csvファイル(ここではdata.csvとします)をそのまま印刷するプログラムを作成したいです。
> ネットで調べても画像の印刷しか出てこず、よくわからなかったので、教えていただけますでしょうか。

Windows OS 付属のメモ帳で開いて印刷してはいかが?

そういうことではなくて、自分でコードを書いてそういうプログラムを作りたいということ
ですか? そうであればきちんと要件を書きましょう。上の質問は丸投げレベル以下です。
引用返信 編集キー/
■98832 / inTopicNo.8)  Re[1]: csvファイルを印刷したい
□投稿者/ furu (145回)-(2021/12/25(Sat) 18:48:37)
No98776 (高校生 さん) に返信
> csvファイル(ここではdata.csvとします)をそのまま印刷するプログラムを作成したいです。
印刷プログラムを作成してみました。

Windows.Forms.Formで作成していて
印刷のFontはFormのFontを使用しています。

string[]    _allLines;    //全行
int         _lineIndex;   //印刷行のインデックス
int         _charIndex;   //印刷行の印刷開始する文字のインデックス

private void button1_Click(object sender, EventArgs e)
{
    _allLines = System.IO.File.ReadAllLines(@"data.csv");

    var pd = new System.Drawing.Printing.PrintDocument();
    pd.PrintPage += PrintPage;

    var pdlg = new PrintDialog();
    pdlg.Document = pd;

    if (pdlg.ShowDialog() != DialogResult.OK) return;

    _lineIndex = 0;
    _charIndex = 0;

    pd.Print();
}

void PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{ 
    var y = 0f;

    for (;;)
    {
        //1行
        var line = _allLines[_lineIndex];

        //空行なら、半角スペース印字でごまかす
        if (string.IsNullOrEmpty(line)) line = " ";
        
        //印刷文字列,サイズ
        var text = line.Substring(_charIndex);
        var size = e.Graphics.MeasureString(text, Font);

        //縦はみ出すなら、改頁
        if (y + size.Height > e.PageBounds.Height)
        {
            e.HasMorePages = true;
            return;
        }

        //横はみ出すなら、短くする
        while (size.Width > e.PageBounds.Width)
        {
            //1文字削除
            text = text.Remove(text.Length - 1);
            size = e.Graphics.MeasureString(text, Font);
        }

        //印刷
        e.Graphics.DrawString(text, Font, Brushes.Black, 0, y);

        //y座標更新
        y += size.Height;

        //_charIndex更新
        _charIndex += text.Length;

        //1行印刷したら、_lineIndex更新
        if (_charIndex == line.Length)
        {
            _lineIndex++;
            _charIndex = 0;
        }

        //全行印刷したら、印刷終了
        if (_lineIndex >= _allLines.Length)
        {
            e.HasMorePages = false;
            return;
        }
    }
}

引用返信 編集キー/
■98833 / inTopicNo.9)  Re[2]: csvファイルを印刷したい
□投稿者/ 高校生 (2回)-(2021/12/25(Sat) 20:22:21)
2021/12/25(Sat) 20:23:36 編集(投稿者)
2021/12/25(Sat) 20:23:26 編集(投稿者)

furuさんの方法で解決しました。ありがとうございました。
他の方もありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ