次のようにHTMLデータをOutlookに渡すことができる必要があります。
MailMessage message = new MailMessage();
message.Body = myBody;
最初は、プレーンテキストを渡してPadLeft
を次のように使用できると思いました。
somestring.PadLeft(100);
しかし、|||||
とMMMMM
はどちらも長さがわずか5文字であり、画面上で物理的に多くのスペースを占有します。
私の解決策は、データテーブルにあるデータをHTMLテーブルに変換してから、それをOutlookに渡すことです。
DataTableをループして、html文字列を作成します。 IE:
DataTable dt = new DataTable();
dt.Columns.Add("col1");
dt.Columns.Add("col2");
dt.Columns.Add("col3");
dt.Rows.Add(new object[] { "a", "b", "c" });
dt.Rows.Add(new object[] { "d", "e", "f" });
string tab = "\t";
StringBuilder sb = new StringBuilder();
sb.AppendLine("<html>");
sb.AppendLine(tab + "<body>");
sb.AppendLine(tab + tab + "<table>");
// headers.
sb.Append(tab + tab + tab + "<tr>");
foreach (DataColumn dc in dt.Columns)
{
sb.AppendFormat("<td>{0}</td>", dc.ColumnName);
}
sb.AppendLine("</tr>");
// data rows
foreach (DataRow dr in dt.Rows)
{
sb.Append(tab + tab + tab + "<tr>");
foreach (DataColumn dc in dt.Columns)
{
string cellValue = dr[dc] != null ? dr[dc].ToString() : "";
sb.AppendFormat("<td>{0}</td>", cellValue);
}
sb.AppendLine("</tr>");
}
sb.AppendLine(tab + tab + "</table>");
sb.AppendLine(tab + "</body>");
sb.AppendLine("</html>");
私がしたことを共有したいだけです。これがお役に立てば幸いです。
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
public void Build(DataSet ds)
{
StringWriter sw = new StringWriter();
HtmlTextWriter w = new HtmlTextWriter(sw);
foreach (DataTable dt in ds.Tables)
{
//Create a table
Table tbl = new Table();
//Create column header row
TableHeaderRow thr = new TableHeaderRow();
foreach (DataColumn col in dt.Columns) {
TableHeaderCell th = new TableHeaderCell();
th.Text = col.Caption;
thr.Controls.Add(th);
}
tbl.Controls.Add(thr);
//Create table rows
foreach (DataRow row in dt.Rows)
{
TableRow tr = new TableRow();
foreach (var value in row.ItemArray)
{
TableCell td= new TableCell();
td.Text = value.ToString();
tr.Controls.Add(td);
}
tbl.Controls.Add(tr);
}
tbl.RenderControl(w);
}
Response.Write(sw.ToString());
}
ここにコードを書くのはかなり長いかもしれません、私は@mservidioに同意します。あなたがしなければならないことの例を見るためにこのリンクをたどってください: このリンク
データテーブルをhtmlテーブルに変換するにはどうすればよいですか?
唯一の方法は、すべての行を調べて、必要な方法でHTML文字列を作成するコードを作成することです。
私の問題に対するより良い解決策はありますか?
モノスペースフォント(Courier
など)を使用できます。wihchを使用すると、適切な数のスペースを出力するだけですべてを適切に配置できますが、適切なフォントを設定してHTML形式でメールを送信する必要があります。ドキュメント。
HTMLを出力する方法はいくつかあります。
これが比較的簡単なフォーマット(フォーマットやスタイルなどがあまりない)の場合、私は間違いなく@mservidioの提案に従います。
出力がより複雑で、ASP.NETの使用経験がある場合は、出力の柔軟性と管理を向上させるUserControlのルートを使用できます。次に、コントロールの出力を次のようにHTMLにレンダリングできます。
StringBuilder sb = new StringBuilder();
StringWriter tw = new StringWriter(sb);
HtmlTextWriter hw = new HtmlTextWriter(tw);
ctrl.RenderControl(hw);
return sb.ToString();
public string ConvertDataTableToHTMLTableInOneLine(DataTable dt)
{
//Convert DataTable To HTML Table in one line
return "<table>\n<tr>" + string.Join("", dt.Columns.Cast<DataColumn>().Select(dc => "<td>" + dc.ColumnName + "</td>")) + "</tr>\n" +
"<tr>" + string.Join("</tr>\n<tr>", dt.AsEnumerable().Select(row => "<td>" + string.Join("</td><td>", row.ItemArray) + "</td>").ToArray()) + "</tr>\n<\table>";
}
これは私のバージョンであり、一般的なルール(rowHighlightRuleパラメーター)に基づいて一部の行を「ハイライト」する可能性が追加されています。
public static string ToHTML(this DataTable dt, Func<DataRow, bool> rowHiglithRule)
{
if (dt == null) throw new ArgumentNullException("dt");
string tab = "\t";
StringBuilder sb = new StringBuilder();
sb.AppendLine(tab + tab + "<table>");
// headers.
sb.Append(tab + tab + tab + "<thead><tr>");
foreach (DataColumn dc in dt.Columns)
{
sb.AppendFormat("<td>{0}</td>", dc.ColumnName);
}
sb.AppendLine("</thead></tr>");
// data rows
foreach (DataRow dr in dt.Rows)
{
if (rowHiglithRule != null)
{
if (rowHiglithRule(dr))
{
sb.Append(tab + tab + tab + "<tr class=\"highlightedRow\">");
}
else
{
sb.Append(tab + tab + tab + "<tr>");
}
}
else
{
//Non ho alcuna regola, quindi caso normale.
sb.Append(tab + tab + tab + "<tr>");
}
foreach (DataColumn dc in dt.Columns)
{
string cellValue = dr[dc] != null ? dr[dc].ToString() : "";
sb.AppendFormat("<td>{0}</td>", cellValue);
}
sb.AppendLine("</tr>");
}
sb.AppendLine(tab + tab + "</table>");
return sb.ToString();
}
public string toHTML_Table(DataTable dt)
{
if (dt.Rows.Count == 0)
return "";
StringBuilder builder = new StringBuilder();
builder.Append("<html>");
builder.Append("<head>");
builder.Append("<title>");
builder.Append("Page-");
builder.Append(Guid.NewGuid().ToString());
builder.Append("</title>");
builder.Append("</head>");
builder.Append("<body>");
builder.Append("<table border='1px' cellpadding='5' cellspacing='0' ");
builder.Append("style='border: solid 1px Silver; font-size: x-small;'>");
builder.Append("<tr align='left' valign='top'>");
foreach (DataColumn c in dt.Columns)
{
builder.Append("<td align='left' valign='top'><b>");
builder.Append(c.ColumnName);
builder.Append("</b></td>");
}
builder.Append("</tr>");
foreach (DataRow r in dt.Rows)
{
builder.Append("<tr align='left' valign='top'>");
foreach (DataColumn c in dt.Columns)
{
builder.Append("<td align='left' valign='top'>");
builder.Append(r[c.ColumnName]);
builder.Append("</td>");
}
builder.Append("</tr>");
}
builder.Append("</table>");
builder.Append("</body>");
builder.Append("</html>");
return builder.ToString();
}