choc000 Ответов: 1

Я пытаюсь показать имя листа excel в messagebox, но, похоже , оно не работает, Может ли кто-нибудь мне помочь?


Я новичок в программировании. Я пытаюсь показать имя листа excel в окне сообщения , но, похоже, оно не работает, Может ли кто-нибудь мне помочь?

Что я уже пробовал:

Я пробовал это кодирование, но окно сообщения не отображается. Нужно ли мне вызывать эту функцию где-то, например, в button1_Click? Серьезно, я не знаю, что мне делать. Спасибо за помощь

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.OleDb;

namespace Filter2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private String[] GetExcelSheetNames(string excelFile)
        {
            OleDbConnection objConn = null;
            System.Data.DataTable dt = null;

            try
            {
                // Connection String. Change the excel file to the file you
                // will search.
                String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                    "Data Source=" + "SamsungGT-i9300GalaxySIII- demo (pendrive).xlsx" + ";Extended Properties=Excel 8.0;";
                // Create connection object by using the preceding connection string.
                objConn = new OleDbConnection(connString);
                // Open connection with the database.
                objConn.Open();
                // Get the data table containg the schema guid.
                dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if (dt == null)
                {
                    return null;
                }

                String[] excelSheets = new String[dt.Rows.Count];
                int i = 0;

                // Add the sheet name to the string array.
                foreach (DataRow row in dt.Rows)
                {
                    excelSheets[i] = row["TABLE_NAME"].ToString();
                    i++;
                }

                // Loop through all of the sheets if you want too...
                for (int j = 0; j < excelSheets.Length; j++)
                {
                    // Query each excel sheet.
                }

                return excelSheets;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                // Clean up.
                if (objConn != null)
                {
                    objConn.Close();
                    objConn.Dispose();
                }
                if (dt != null)
                {
                    dt.Dispose();
                }
            }
        }
    }
}

CHill60

В этом коде нет окон сообщений!

[no name]

Вы должны взять книгу по основному программированию на C# и поработать над ней. Или, что еще лучше, возьмите класс, чтобы научить вас программированию.

Richard MacCutchan

У меня есть похожая программа, которая отлично работает, получая все имена таблиц. Вам нужно пройти через свой код с помощью отладчика, чтобы точно увидеть, что происходит: сколько строк возвращается и какие имена листов найдены.

Я также замечаю, что вы игнорируете любое исключение в своем блоке catch, так что у вас вполне может быть ошибка, которую вы никогда не увидите. Вы должны понимать, что try/catch-это не механизм для того, чтобы ваш код работал, несмотря на ошибки, а для того, чтобы помочь их исправить.

Richard Deeming

"Нужно ли мне где-то вызывать эту функцию ..."

Да. Функции сами себя не называют.

Richard MacCutchan

Ха-ха,не заметил.

1 Ответов

Рейтинг:
12

CHill60

Избавьтесь от try-catch. Вы "глотаете" любые исключения, которые выбрасываются, что является очень, очень плохой практикой. Вам также не нужно утилизировать и т. д., Если вы используете using

Вам нужно правильно отладить это - вот стартовая статья, если вы не уверены, как это сделать: Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Попробовать это

private String[] GetExcelSheetNames(string excelFile)
{
    var connString = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties=Excel 8.0;";
    var excelSheets = new string[0];

    using(var objConn = new OleDbConnection(connString))
    {
        objConn.Open();

        // Get the data table containg the schema guid.
        using (var dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
        {
            if (dt != null)
            {
                excelSheets = new String[dt.Rows.Count];

                for (var i = 0; i < dt.Rows.Count; i++)
                    excelSheets[i] = dt.Rows[i]["TABLE_NAME"].ToString();
            }
            objConn.Close();
        }
    }

    foreach (var sht in excelSheets)
        Debug.Print(sht);

    return excelSheets;
}

Да, вам нужно будет вызвать это откуда-то, и событие нажатия кнопки-хороший выбор.


choc000

Спасибо за объяснение. Это мне очень помогло. У меня есть решение. Да, я наконец-то понял, что такое try&catch и что я должен делать.