访问宇宙 2023-03-05 16:29 采纳率: 80.4%
浏览 30
已结题

如何把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中  
    /// <param name="sheetName">excel工作薄sheet的名称</param>  
    /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>  
    /// <returns>返回的DataTable</returns>  
    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中  
    //<param name="data">要导入的数据</param>  
    //<param name="sheetName">要导入的excel的sheet的名称</param>  
    //<param name="isColumnWritten">DataTable的列名是否要导入</param>  
    //<returns>导入数据行数(包含列名那一行)</returns>  
    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;  
        }  
    }  
}
  • 写回答

1条回答 默认 最新

  • Web Security Loop 2023-03-06 09:28
    关注
    • 参考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
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月5日

悬赏问题

  • ¥15 hfss 组天线阵列报错:The A and B vectors must be parallel to the XY plane,如何解决?
  • ¥30 ansible连接设备报错
  • ¥60 pmsampsize包取值问题
  • ¥15 波形合成电路的设计学习
  • ¥15 unity脚本挂不上
  • ¥15 数学建模数学建模需要
  • ¥20 Java Sound Api 调用Mixer.getLine偶现Line unsupported错误。
  • ¥15 使用cuda加速opencv运算但是报错AttributeError: module 'cv2.cuda' has no attribute 'getCudaEnabledDeviceCount'
  • ¥15 java输入输出异常
  • ¥15 三子连珠对弈小游戏制作