- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Hướng dẫn xuất dữ liệu từ DataTable sang file Text .txt
Xin chào các bạn, bài viết hôm nay mình sẻ chia sẽ đến các bạn thư viện Tablehelper.cs
để xuất dữ liệu từ một DataTable thành file text .txt có ô kẻ trong lập trình C#, Winform.
[C#] Export DataTable to Text File with border table
Thông thường khi các bạn ghi ra file Text, các bạn thường ngăn cách các dòng bởi một ký tự đặc biệt nào đó như: chấm phẩy, dấu | ...
Trong bài viết này mình đã viết sẵn class TableHelper.cs để lưu file text văn bản từ DataTable trong C#.
Giao diện demo ứng dụng Export Text File C#:
Đầu tiên các bạn tạo file TableHelper.cs:
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ExportDataTableToTextFile
{
public class TableHelper
{
private const string TopLeftJoint = "┌";
private const string TopRightJoint = "┐";
private const string BottomLeftJoint = "└";
private const string BottomRightJoint = "┘";
private const string TopJoint = "┬";
private const string BottomJoint = "┴";
private const string LeftJoint = "├";
private const string MiddleJoint = "┼";
private const string RightJoint = "┤";
private const char HorizontalLine = '─';
private const string VerticalLine = "│";
private string[] _headers;
private List<string[]> _rows = new List<string[]>();
public int Padding { get; set; } = 1;
public bool HeaderTextAlignRight { get; set; }
public bool RowTextAlignRight { get; set; }
public void WriteDataTableToTextFile(DataTable dataTable, string PathFileName, bool hasHeader = true)
{
var table = new TableHelper();
if (hasHeader)
{
string[] columnNames = dataTable.Columns.Cast<DataColumn>()
.Select(x => x.ColumnName)
.ToArray();
table.SetHeaders(columnNames);
}
foreach (DataRow row in dataTable.Rows)
{
var rowArray = row.ItemArray.Cast<string>().ToArray();
table.AddRow(rowArray);
}
File.WriteAllText(PathFileName, table.ToString());
}
public void SetHeaders(params string[] headers)
{
_headers = headers;
}
public void AddRow(params string[] row)
{
_rows.Add(row);
}
public void ClearRows()
{
_rows.Clear();
}
private int[] GetMaxCellWidths(List<string[]> table)
{
var maximumColumns = 0;
foreach (var row in table)
{
if (row.Length > maximumColumns)
maximumColumns = row.Length;
}
var maximumCellWidths = new int[maximumColumns];
for (int i = 0; i < maximumCellWidths.Count(); i++)
maximumCellWidths[i] = 0;
var paddingCount = 0;
if (Padding > 0)
{
//Padding is left and right
paddingCount = Padding * 2;
}
foreach (var row in table)
{
for (int i = 0; i < row.Length; i++)
{
var maxWidth = row[i].Length + paddingCount;
if (maxWidth > maximumCellWidths[i])
maximumCellWidths[i] = maxWidth;
}
}
return maximumCellWidths;
}
private StringBuilder CreateTopLine(int[] maximumCellWidths, int rowColumnCount, StringBuilder formattedTable)
{
for (int i = 0; i < rowColumnCount; i++)
{
if (i == 0 && i == rowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", TopLeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), TopRightJoint));
else if (i == 0)
formattedTable.Append(string.Format("{0}{1}", TopLeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
else if (i == rowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", TopJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), TopRightJoint));
else
formattedTable.Append(string.Format("{0}{1}", TopJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
}
return formattedTable;
}
private StringBuilder CreateBottomLine(int[] maximumCellWidths, int rowColumnCount, StringBuilder formattedTable)
{
for (int i = 0; i < rowColumnCount; i++)
{
if (i == 0 && i == rowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", BottomLeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), BottomRightJoint));
else if (i == 0)
formattedTable.Append(string.Format("{0}{1}", BottomLeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
else if (i == rowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", BottomJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), BottomRightJoint));
else
formattedTable.Append(string.Format("{0}{1}", BottomJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
}
return formattedTable;
}
private StringBuilder CreateValueLine(int[] maximumCellWidths, string[] row, bool alignRight, StringBuilder formattedTable)
{
int cellIndex = 0;
int lastCellIndex = row.Length - 1;
var paddingString = string.Empty;
if (Padding > 0)
paddingString = string.Concat(Enumerable.Repeat(' ', Padding));
foreach (var column in row)
{
var restWidth = maximumCellWidths[cellIndex];
if (Padding > 0)
restWidth -= Padding * 2;
var cellValue = alignRight ? column.PadLeft(restWidth, ' ') : column.PadRight(restWidth, ' ');
if (cellIndex == 0 && cellIndex == lastCellIndex)
formattedTable.AppendLine(string.Format("{0}{1}{2}{3}{4}", VerticalLine, paddingString, cellValue, paddingString, VerticalLine));
else if (cellIndex == 0)
formattedTable.Append(string.Format("{0}{1}{2}{3}", VerticalLine, paddingString, cellValue, paddingString));
else if (cellIndex == lastCellIndex)
formattedTable.AppendLine(string.Format("{0}{1}{2}{3}{4}", VerticalLine, paddingString, cellValue, paddingString, VerticalLine));
else
formattedTable.Append(string.Format("{0}{1}{2}{3}", VerticalLine, paddingString, cellValue, paddingString));
cellIndex++;
}
return formattedTable;
}
private StringBuilder CreateSeperatorLine(int[] maximumCellWidths, int previousRowColumnCount, int rowColumnCount, StringBuilder formattedTable)
{
var maximumCells = Math.Max(previousRowColumnCount, rowColumnCount);
for (int i = 0; i < maximumCells; i++)
{
if (i == 0 && i == maximumCells - 1)
{
formattedTable.AppendLine(string.Format("{0}{1}{2}", LeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), RightJoint));
}
else if (i == 0)
{
formattedTable.Append(string.Format("{0}{1}", LeftJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
}
else if (i == maximumCells - 1)
{
if (i > previousRowColumnCount)
formattedTable.AppendLine(string.Format("{0}{1}{2}", TopJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), TopRightJoint));
else if (i > rowColumnCount)
formattedTable.AppendLine(string.Format("{0}{1}{2}", BottomJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), BottomRightJoint));
else if (i > previousRowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", MiddleJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), TopRightJoint));
else if (i > rowColumnCount - 1)
formattedTable.AppendLine(string.Format("{0}{1}{2}", MiddleJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), BottomRightJoint));
else
formattedTable.AppendLine(string.Format("{0}{1}{2}", MiddleJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine), RightJoint));
}
else
{
if (i > previousRowColumnCount)
formattedTable.Append(string.Format("{0}{1}", TopJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
else if (i > rowColumnCount)
formattedTable.Append(string.Format("{0}{1}", BottomJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
else
formattedTable.Append(string.Format("{0}{1}", MiddleJoint, string.Empty.PadLeft(maximumCellWidths[i], HorizontalLine)));
}
}
return formattedTable;
}
public override string ToString()
{
var table = new List<string[]>();
var firstRowIsHeader = false;
if (_headers?.Any() == true)
{
table.Add(_headers);
firstRowIsHeader = true;
}
if (_rows?.Any() == true)
table.AddRange(_rows);
if (!table.Any())
return string.Empty;
var formattedTable = new StringBuilder();
var previousRow = table.FirstOrDefault();
var nextRow = table.FirstOrDefault();
int[] maximumCellWidths = GetMaxCellWidths(table);
formattedTable = CreateTopLine(maximumCellWidths, nextRow.Count(), formattedTable);
int rowIndex = 0;
int lastRowIndex = table.Count - 1;
for (int i = 0; i < table.Count; i++)
{
var row = table[i];
var align = RowTextAlignRight;
if (i == 0 && firstRowIsHeader)
align = HeaderTextAlignRight;
formattedTable = CreateValueLine(maximumCellWidths, row, align, formattedTable);
previousRow = row;
if (rowIndex != lastRowIndex)
{
nextRow = table[rowIndex + 1];
formattedTable = CreateSeperatorLine(maximumCellWidths, previousRow.Count(), nextRow.Count(), formattedTable);
}
rowIndex++;
}
formattedTable = CreateBottomLine(maximumCellWidths, previousRow.Count(), formattedTable);
return formattedTable.ToString();
}
}
}
Và Source code sử dụng cho Form1.cs xuất Table ra Text file
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ExportDataTableToTextFile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable table;
private void btnWriteFile_Click(object sender, EventArgs e)
{
new TableHelper().WriteDataTableToTextFile(table, "info.txt");
Process.Start(Application.StartupPath + "\\" + "info.txt");
}
private void Form1_Load(object sender, EventArgs e)
{
table = new DataTable();
table.Columns.Add("ID");
table.Columns.Add("Name");
table.Columns.Add("Gender");
table.Columns.Add("Day of Birth");
table.Columns.Add("Address");
table.Rows.Add(1, "Nguyễn Thảo", "Nam", "28/03/1988", "Bà Rịa Vũng Tàu");
table.Rows.Add(2, "Nguyễn Phương Nhi", "Nữ", "28/10/2020", "Bà Rịa Vũng Tàu");
table.Rows.Add(3, "Nguyễn Đình Tuyên", "Nam", "19/12/2014", "Quảng Bình");
table.Rows.Add(4, "Trịnh Quốc Khang", "Nam", "01/01/1998", "Đồng Nai");
table.Rows.Add(5, "Võ Sơn Băng", "Nam", "10/03/1988", "Vĩnh Long");
table.Rows.Add(6, "Cái Trí Minh", "Nam", "10/05/1997", "Đồng Nai");
table.Rows.Add(7, "Hoàng Dược Sư", "Nam", "17/08/1987", "Đông Tà");
table.Rows.Add(8, "Âu Dương Phong", "Nam", "19/10/2005", "Tây Độc");
table.Rows.Add(9, "Hồng Thất Công", "Nam", "18/03/1987", "Bắc Cái");
table.Rows.Add(10, "Dương Quá", "Nam", "18/03/1988", "Trung Quốc");
table.Rows.Add(11, "Long Nhi", "Nữ", "05/03/1988", "China");
table.Rows.Add(12, "Hoàng Dung", "Nữ", "05/03/1988", "Hồng Kông");
table.Rows.Add(13, "Doãn Chí Bình", "Nam", "15/03/1988", "Ma Cau");
table.Rows.Add(14, "Trương Vô Kỵ", "Nam", "15/03/1988", "Ma Cau");
table.Rows.Add(15, "Trương Tam Phong", "Nam", "15/03/1988", "Ma Cau");
dataGridView1.DataSource = table;
}
}
}
Thanks for watching!