如何把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代码。
#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