[C#] Read data from Google Sheet use HttpRequest without Speadsheet API
Dưới đây, là hình ảnh demo ứng dụng đọc bảng table từ SpeadSheet Google
.

Khi các bạn send 1 request trên Postman thì chúng ta được kết quả như hình bên dưới:

Dữ liệu trả về là 1 Table HTML, nên chúng ta chỉ cần dùng thư viện HTMLAglitypack
để đọc chuyển dữ liệu từ Table HTML sang DataTable trên C#, và hiện thị nó lên DataGridView.
Source code C# đầy đủ:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DemoReadGoogleSheet
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnReadGoogleSheet_Click(object sender, EventArgs e)
{
var google_sheet_url = @"https://docs.google.com/spreadsheets/u/0/d/1ifPr7foe2DJiVZoZ-wUkDlyjKbDneeowprTGowejnZI/gviz/tq?tqx=out:html&tq&gid=1";
var dataTable = GetGoogleSheetAsDataTable(google_sheet_url);
dataGridView1.DataSource = dataTable;
}
public static DataTable GetGoogleSheetAsDataTable(string sheetUrl)
{
string htmlContent = GetHtmlContent(sheetUrl);
return ParseHtmlToDataTable(htmlContent);
}
private static string GetHtmlContent(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
private static DataTable ParseHtmlToDataTable(string htmlContent)
{
DataTable dt = new DataTable();
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
var table = htmlDoc.DocumentNode.SelectSingleNode("//table");
if (table == null)
{
return dt;
}
var headerRow = table.SelectSingleNode(".//thead/tr");
if (headerRow != null)
{
foreach (var th in headerRow.SelectNodes("th"))
{
dt.Columns.Add(WebUtility.HtmlDecode( th.InnerText.Trim()));
}
}
else
{
var firstRow = table.SelectSingleNode(".//tr");
if (firstRow != null)
{
foreach (var td in firstRow.SelectNodes("td"))
{
dt.Columns.Add(td.InnerText.Trim());
}
}
}
var rows = table.SelectNodes(".//tr");
foreach (var row in rows)
{
DataRow dr = dt.NewRow();
var cells = row.SelectNodes("td");
if (cells != null)
{
for (int i = 0; i < cells.Count && i < dt.Columns.Count; i++)
{
dr[i] = WebUtility.HtmlDecode( cells[i].InnerText.Trim());
}
dt.Rows.Add(dr);
}
}
return dt;
}
}
}