簡體   English   中英

如何在不使用 openfiledialog C# 的情況下更新 Excel 閱讀器

[英]How to Update an Excel Reader without using an openfiledialog C#

我可能對這個問題的措辭有誤,但更容易解釋。

基本上在我的表單上,我有一個按鈕,如果你點擊它,它會打開一個 OpenFileDialog 搜索框,你可以打開一個 excel 文件,它會顯示在表單中的各種 datagridview 框中。 然后您可以將數據輸入到excel工作表中。 然而,因為我是一個新手程序員,我只能通過再次單擊按鈕並再次瀏覽 OpenFileDialog 來更新那些數據網格視圖。

這是我用來最初閱讀 excel 工作表的代碼。

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            FileStream fs = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
            IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
            reader.IsFirstRowAsColumnNames = true;
            result = reader.AsDataSet();

            cboSheet.Items.Clear();
            cboSheet_mirror.Items.Clear();
            resultSheet.Items.Clear();

            foreach (System.Data.DataTable dt in result.Tables)
            {
                cboSheet.Items.Add(dt.TableName);
                cboSheet_mirror.Items.Add(dt.TableName);
                resultSheet.Items.Add(dt.TableName);
            }
            reader.Close();
        }
(...)

cboSheet 和 resultSheets 不相關,它們只是我用來導航不同工作表的工具。

我想要做的是創建一個方法,它用編輯過的 excel 工作表更新 datagridview,但用戶不必每次都經過 OpenFileDialog 過程,程序只知道 excel 文件的路徑。

希望這是有道理的。

記住文件路徑的最簡單方法是在用戶成功選擇文件后將其保存在類成員中:

string currentFilePath {get;set;} //Class member that will hold the path

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            this.currentFilePath = ofd.FullName; //remember the path here

            (...)

然后在您的類中的任何其他方法或事件處理程序中,您可以讀取該路徑並再次打開 excel 文件,而無需另一個文件選擇過程:

private void someOtherButton_Click(object sender, EventArgs e)
{ 
     //read the file from the remembered path
     FileStream fs = File.Open(this.currentFilePath, FileMode.Open, FileAccess.Read);
     IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
     (...)

有關此主題的更多信息,我建議您閱讀一些關於Variable scopes文章(如本篇

我認為您應該有一個 TextBox -例如 ExcelFileTextBox-,您可以在其中瀏覽 Excel 文件,在檢查DialogResult.OK設置其Text屬性,這也會通知用戶有關 Excel 路徑和文件名的信息。
您應該將 Excel 讀取數據移動到 - 私有 - 方法,如下所示:

private void ReadExcelData(string filename)
{
    FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);
    IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(fs);
    reader.IsFirstRowAsColumnNames = true;
    result = reader.AsDataSet();

    cboSheet.Items.Clear();
    cboSheet_mirror.Items.Clear();
    resultSheet.Items.Clear();

    foreach (System.Data.DataTable dt in result.Tables)
    {
        cboSheet.Items.Add(dt.TableName);
        cboSheet_mirror.Items.Add(dt.TableName);
        resultSheet.Items.Add(dt.TableName);
    }

    reader.Close();
}

您的瀏覽按鈕代碼將變為:

private void button18_Click(object sender, EventArgs e)
{
    using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel Workbook|*.xlsx", ValidateNames = true })
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            ExcelFileTextBox.Text = ofd.FileName;
            ReadExcelData(ofd.FileName);
         }
    }
}

然后添加一個刷新按鈕,它也像這樣調用ReadExcelData

private void RefreshButton_Click(object sender, EventArgs e)
{
    ReadExcelData(ExcelFileTextBox.Text);
}

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM