如何把CSharp复写成QT代码?

如何把CSharp复写成QT代码?


public class ExcelHelper : IDisposable   
{  
    private string fileName = null; //文件名  
    private IWorkbook workbook = null;  
    private FileStream fs = null;  
    private bool disposed;  
    public ExcelHelper(string fileName)//构造函数,读入文件名  
    {  
        this.fileName = fileName;  
        disposed = false;  
    }  
    /// 将excel中的数据导入到DataTable中  
    /// excel工作薄sheet的名称  
    /// 第一行是否是DataTable的列名  
    /// 返回的DataTable  
    public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)  
    {  
        ISheet sheet = null;  
        DataTable data = new DataTable();  
        int startRow = 0;  
        try  
        {  
            fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);  
            workbook = WorkbookFactory.Create(fs);  
            if (sheetName != null)  
            {  
                sheet = workbook.GetSheet(sheetName);  
                //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet  
                if (sheet == null)   
                {  
                    sheet = workbook.GetSheetAt(0);  
                }  
            }  
            else  
            {  
                sheet = workbook.GetSheetAt(0);  
            }  
            if (sheet != null)  
            {  
                IRow firstRow = sheet.GetRow(0);  
                int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号,即总的列数  
                if (isFirstRowColumn)  
                {  
                    for (int i = firstRow.FirstCellNum; i < cellCount; ++i)  
                    {  
                        ICell cell = firstRow.GetCell(i);  
                        if (cell != null)  
                        {  
                            string cellValue = cell.StringCellValue;  
                            if (cellValue != null)  
                            {  
                                DataColumn column = new DataColumn(cellValue);  
                                data.Columns.Add(column);  
                            }  
                        }  
                    }  
                    startRow = sheet.FirstRowNum + 1;//得到项标题后  
                }  
                else  
                {  
                    startRow = sheet.FirstRowNum;  
                }  
                //最后一列的标号  
                int rowCount = sheet.LastRowNum;  
                for (int i = startRow; i <= rowCount; ++i)  
                {  
                    IRow row = sheet.GetRow(i);  
                    if (row == null) continue; //没有数据的行默认是null         
  
                    DataRow dataRow = data.NewRow();  
                    for (int j = row.FirstCellNum; j < cellCount; ++j)  
                    {  
                        if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null  
                            dataRow[j] = row.GetCell(j).ToString();  
                    }  
                    data.Rows.Add(dataRow);  
                }  
            }  
            return data;  
        }  
        catch (Exception ex)//打印错误信息  
        {  
            MessageBox.Show("Exception: " + ex.Message);  
            return null;  
        }  
    }  
  
    //将DataTable数据导入到excel中  
    //要导入的数据  
    //要导入的excel的sheet的名称  
    //DataTable的列名是否要导入  
    //导入数据行数(包含列名那一行)  
    public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)  
    {  
        int i = 0;  
        int j = 0;  
        int count = 0;  
        ISheet sheet = null;  
  
        fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);  
        if (fileName.IndexOf(".xlsx") > 0) // 2007版本  
            workbook = new XSSFWorkbook();  
        else if (fileName.IndexOf(".xls") > 0) // 2003版本  
            workbook = new HSSFWorkbook();  
  
        try  
        {  
            if (workbook != null)  
            {  
                sheet = workbook.CreateSheet(sheetName);  
            }  
            else  
            {  
                return -1;  
            }  
  
            if (isColumnWritten == true) //写入DataTable的列名  
            {  
                IRow row = sheet.CreateRow(0);  
                for (j = 0; j < data.Columns.Count; ++j)  
                {  
                    row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);  
                }  
                count = 1;  
            }  
            else  
            {  
                count = 0;  
            }  
  
            for (i = 0; i < data.Rows.Count; ++i)  
            {  
                IRow row = sheet.CreateRow(count);  
                for (j = 0; j < data.Columns.Count; ++j)  
                {  
                    row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());  
                }  
                ++count;  
            }  
            workbook.Write(fs); //写入到excel  
            return count;  
        }  
        catch (Exception ex)  
        {  
            Console.WriteLine("Exception: " + ex.Message);  
            return -1;  
        }  
    }  
  
    public void Dispose()//IDisposable为垃圾回收相关的东西,用来显式释放非托管资源,这部分目前还不是非常了解  
    {  
        Dispose(true);  
        GC.SuppressFinalize(this);  
    }  
    protected virtual void Dispose(bool disposing)  
    {  
        if (!this.disposed)  
        {  
            if (disposing)  
            {  
                if (fs != null)  
                    fs.Close();  
            }  
            fs = null;  
            disposed = true;  
        }  
    }  
}
  • 参考GPT的内容和自己的思路:

  • 为了把C#代码转换成QT代码,您需要先确定QT中的类库和数据类型,然后将C#代码转换为相应的QT代码。

  • 对于此代码,您需要使用QT的QTableWidget类来处理数据表,并使用QFile类来处理文件流。以下是一个基本的QT代码示例,可以导入和导出Excel表格数据:
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QFileDialog>
#include <QtWidgets/QMessageBox>
#include <QtWidgets/QTableWidget>
#include <QtCore/QFile>
#include <QtCore/QTextStream>
#include <QtCore/QIODevice>

QTableWidget* createTable(const QString& fileName, const QString& sheetName, bool isFirstRowHeader)
{
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly)) {
        QMessageBox::critical(nullptr, QObject::tr("Error"), QObject::tr("Failed to open file."));
        return nullptr;
    }

    QTextStream in(&file);
    QString line = in.readLine(); // 读取第一行
    QStringList headers;
    if (isFirstRowHeader) {
        headers = line.split("\t"); // 分割以制表符为分隔符的标题行
        line = in.readLine(); // 跳过标题行
    }

    QTableWidget* tableWidget = new QTableWidget();
    tableWidget->setColumnCount(headers.size()); // 设置列数
    tableWidget->setHorizontalHeaderLabels(headers); // 设置水平表头

    int row = 0;
    while (!line.isNull()) {
        QStringList fields = line.split("\t");
        tableWidget->insertRow(row);
        for (int i = 0; i < headers.size(); ++i) {
            if (i < fields.size()) {
                QTableWidgetItem* item = new QTableWidgetItem(fields.at(i));
                tableWidget->setItem(row, i, item);
            }
        }
        ++row;
        line = in.readLine();
    }

    file.close();
    return tableWidget;
}

bool saveTable(QTableWidget* tableWidget, const QString& fileName)
{
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
        QMessageBox::critical(nullptr, QObject::tr("Error"), QObject::tr("Failed to save file."));
        return false;
    }

    QTextStream out(&file);
    QStringList headers;
    for (int i = 0; i < tableWidget->columnCount(); ++i) {
        headers << tableWidget->horizontalHeaderItem(i)->text();
    }
    out << headers.join("\t") << "\n";

    for (int i = 0; i < tableWidget->rowCount(); ++i) {
        QStringList fields;
        for (int j = 0; j < tableWidget->columnCount(); ++j) {
            QTableWidgetItem* item = tableWidget->item(i, j);
            if (item != nullptr) {
                fields << item->text();
            }
            else {
                fields << "";
            }
        }
        out << fields.join("\t") << "\n";
    }

    file.close();
    return true;
}

int main(int argc, char* argv[])
{
    QApplication a(argc, argv);
    QMainWindow window;

    QTableWidget* tableWidget = new QTableWidget();
    window.setCentralWidget(tableWidget);

    QString fileName = QFileDialog::getOpenFileName(nullptr, QObject::tr("Open Excel file"), "", QObject::tr("Excel Files (*.xls *.xlsx)"));
    if (!fileName.isEmpty()) {
        QString sheetName = "Sheet1"; // Excel


  • 我把你的代码完整修改后是:
#include <QString>
#include <QMessageBox>
#include <QFile>
#include <QIODevice>
#include <QDataStream>
#include <QVariant>
#include <QVariantList>
#include <QVariantMap>
#include <QDateTime>

class ExcelHelper
{
public:
    ExcelHelper(QString fileName) //构造函数,读入文件名  
    {
        this->fileName = fileName;
        disposed = false;
    }

    ~ExcelHelper()
    {
        if (!disposed)
        {
            dispose();
        }
    }

    // 将excel中的数据导入到QVariantList中
    QVariantList excelToQVariantList(QString sheetName, bool isFirstRowColumn)
    {
        QVariantList dataList;
        int startRow = 0;
        try
        {
            QFile file(fileName);
            if (!file.open(QIODevice::ReadOnly))
            {
                QMessageBox::warning(NULL, "错误", "无法打开文件");
                return dataList;
            }

            QByteArray data = file.readAll();
            file.close();

            QDataStream stream(data);
            stream.setByteOrder(QDataStream::LittleEndian);

            qint16 BOFType;
            qint16 version;
            qint16 type;
            qint16 id;
            qint32 length;
            quint16 rows;
            quint16 cols;

            // 文件头信息
            stream >> BOFType >> version;

            while (!stream.atEnd())
            {
                stream >> type >> id >> length;
                switch (type)
                {
                case 0x000A: // 记录行
                    stream.skipRawData(4); // 跳过未知字段
                    rows = stream.device()->read(2).toUShort();
                    cols = stream.device()->read(2).toUShort();
                    stream.skipRawData(16); // 跳过未知字段

                    // 处理第一行
                    if (isFirstRowColumn && startRow == 0)
                    {
                        for (int i = 0; i < cols; ++i)
                        {
                            QByteArray columnName = readString(stream);
                            dataList.append(columnName);
                        }
                        ++startRow;
                    }

                    // 处理数据行
                    if (sheetName.isNull() || sheetName.isEmpty() || sheetName == readString(stream))
                    {
                        for (int i = startRow; i < rows; ++i)
                        {
                            QVariantMap rowMap;
                            for (int j = 0; j < cols; ++j)
                            {
                                QByteArray columnName = dataList.at(j).toByteArray();
                                QByteArray cellValue = readString(stream);
                                rowMap.insert(QString::fromUtf8(columnName), QString::fromUtf8(cellValue));
                            }
                            dataList.append(rowMap);
                        }
                    }
                    else
                    {
                        stream.skipRawData(cols * 8);
                    }

                    break;
                default:
                    stream.skipRawData(length);
                    break;
                }
            }

            return dataList;
        }
        catch (...)
        {
            QMessageBox::warning(NULL, "错误", "解析文件失败");
            return dataList;
        }
    }

private:
    QString fileName; // 文件名  
    bool disposed;

    void dispose()
    {
        if (workbook != nullptr)
        {
            workbook->close();
            delete workbook;
            workbook = nullptr;
        }

        disposed = true;
    }

    QByteArray readString(QDataStream& stream)
    {
        qint16 length;
        stream >> length;
        return stream.device()->read(length);
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Excel