ChatGPT初尝试 您所在的位置:网站首页 tableau表格合并 ChatGPT初尝试

ChatGPT初尝试

2023-06-09 21:23| 来源: 网络整理| 查看: 265

ChatGPT真的能提升生产力吗?【AI版】 无意间的刷到的视频一、提需求二、ChatGPT用Python编写代码三、意外的解释四、ChatGPT改用Java编写代码五、GPT第二次生成Java代码尾巴

无意间的刷到的视频

晚上在家刷视频,突然看到一个在讲关于AI编程的视频,心里疑问:真的假的,这么厉害的吗?于是我看完他的讲解和操作,他这个视频中确实用ChatGPT实现了他所提出的要求,编写了一段代码,当然,up主要求用的Python编写的,我不知道用C++或者Java行不行得通,接下来我就亲自使用以下ChatGPT,验验货。 开图

一、提需求

我需要将给定文件夹中的所有Excel表数据,汇总到一个给定的Excel表中,请按照以下要求, 编写Python: 一、每个分表中有两个sheet,第一个是班级基本信息,第二个是班级学生成绩排名; 二、班级基本信息sheet中,班级编号、教师姓名、班级人数、班长,教师姓名; 三、班级成绩排名sheet中,第一列是序号、第二列是学号、第三列是学生姓名、第四列是成绩; 四、总表只需要一个sheet,并且需将列设置为序号、班级编号、教师姓名、班级人数、班长、学号、学生姓名、成绩; 五、班级编号、教师姓名、班级人数,必须要和每个学生的成绩信息一一对应; 六、做一个程序运行进度条,表示已复制到的学生条目数。

二、ChatGPT用Python编写代码

下面是使用GPT的截图:

需求

代码01

生成代码如下:

import os import openpyxl from tqdm import tqdm # 定义常量 BASE_DIR = 'path/to/folder' # 文件夹路径 OUTPUT_FILE = 'path/to/output.xlsx' # 输出文件路径 SHEET_NAMES = ['基本信息', '成绩排名'] # sheet名称 HEADER_ROWS = [1, 1] # 表头所在行数 HEADER_COLS = [1, 1] # 表头所在列数 CLASS_INFO_COLS = [1, 2, 3, 4, 2] # 班级基本信息所在列数 RANK_COLS = [1, 2, 3, 4] # 成绩排名所在列数 # 初始化输出文件 output_wb = openpyxl.Workbook() output_ws = output_wb.active output_ws.append(['序号', '班级编号', '教师姓名', '班级人数', '班长', '学号', '学生姓名', '成绩']) # 遍历文件夹中的Excel文件 for filename in tqdm(os.listdir(BASE_DIR)): if not filename.endswith('.xlsx'): continue # 打开文件 filepath = os.path.join(BASE_DIR, filename) wb = openpyxl.load_workbook(filepath) # 遍历sheet for i, sheet_name in enumerate(SHEET_NAMES): ws = wb[sheet_name] # 获取表头 header_row = HEADER_ROWS[i] header_col = HEADER_COLS[i] header = [cell.value for cell in ws[header_row] if cell.value] # 获取班级基本信息 if sheet_name == '基本信息': class_info = [ws.cell(row=header_row+1, column=col).value for col in CLASS_INFO_COLS] # 获取成绩排名 elif sheet_name == '成绩排名': for row in range(header_row+1, ws.max_row+1): rank = [ws.cell(row=row, column=col).value for col in RANK_COLS] output_ws.append([output_ws.max_row, *class_info, *rank]) wb.close() # 保存输出文件 output_wb.save(OUTPUT_FILE)

这还不是最厉害的

三、意外的解释

更令人惊讶的是还会对代码进行解释,这就不得了了。接下来看看GPT对它所生成代码的解释: 解释一下代码的主要部分:

第1行导入了必要的模块,其中os用于文件操作,openpyxl用于读写Excel文件,tqdm用于显示进度条。第5-9行定义了常量,包括文件夹路径、输出文件路径、sheet名称等。第12-19行初始化输出文件,创建一个新的Excel文件,并在第一个sheet中添加表头。第22-42行遍历文件夹中的Excel文件,打开每个文件并遍历其中的sheet。第25-27行判断当前sheet是班级基本信息还是成绩排名,分别获取表头和班级基本信息。第30-37行在成绩排名sheet中遍历每一行,获取学生的成绩信息,并将班级基本信息和成绩信息合并到输出文件中。第40-41行关闭当前文件。第44-46行保存输出文件。 其中使用了tqdm模块来显示进度条,可以让程序更加友好。如果没有安装该模块,可以使用以下命令进行安装: pip install tqdm

这个效果非常不错了,如果运行上述代码有误,还可以复制错误提示让GPT分析并解决问题,可以说是保姆级别的开发助手了。

四、ChatGPT改用Java编写代码

本来到这里视频里up主就结束的,我又想了一下,能否用Java语言实现出来,于是就开始给GPT命令,很简单,只需把需求描述里的Python改为Java即可: 改为Java语言编写代码

生成代码如下:

import java.io.File; import java.io.IOException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.util.ArrayList; import java.util.List; import java.util.Objects; public class ExcelMerger { public static final String BASE_DIR = "path/to/folder"; // 文件夹路径 public static final String OUTPUT_FILE = "path/to/output.xlsx"; // 输出文件路径 public static final String[] SHEET_NAMES = {"基本信息", "成绩排名"}; // sheet名称 public static final int[] HEADER_ROWS = {0, 0}; // 表头所在行数 public static final int[] HEADER_COLS = {0, 0}; // 表头所在列数 public static final int[] CLASS_INFO_COLS = {0, 1, 2, 3, 1}; // 班级基本信息所在列数 public static final int[] RANK_COLS = {0, 1, 2, 3}; // 成绩排名所在列数 public static void main(String[] args) { // 初始化输出文件 Workbook outputWb = new XSSFWorkbook(); Sheet outputWs = outputWb.createSheet("汇总数据"); Row headerRow = outputWs.createRow(0); headerRow.createCell(0).setCellValue("序号"); headerRow.createCell(1).setCellValue("班级编号"); headerRow.createCell(2).setCellValue("教师姓名"); headerRow.createCell(3).setCellValue("班级人数"); headerRow.createCell(4).setCellValue("班长"); headerRow.createCell(5).setCellValue("学号"); headerRow.createCell(6).setCellValue("学生姓名"); headerRow.createCell(7).setCellValue("成绩"); // 遍历文件夹中的Excel文件 File folder = new File(BASE_DIR); File[] files = folder.listFiles(); int rowNum = 1; // 当前行号 for (File file : Objects.requireNonNull(files)) { if (!file.isFile() || !file.getName().endsWith(".xlsx")) { continue; } try { // 打开文件 Workbook wb = new XSSFWorkbook(file); for (int i = 0; i continue; } // 获取表头 int headerRowNum = HEADER_ROWS[i]; int headerColNum = HEADER_COLS[i]; Row headerRow = sheet.getRow(headerRowNum); List header = new ArrayList(); for (int j = headerColNum; j header.add(cell.getStringCellValue()); } else { header.add(""); } } // 获取班级基本信息 if (SHEET_NAMES[i].equals("基本信息")) { Row classInfoRow = sheet.getRow(headerRowNum + 1); String classId = classInfoRow.getCell(CLASS_INFO_COLS[0]).getStringCellValue(); String teacherName = classInfoRow.getCell(CLASS_INFO_COLS[1]).getStringCellValue(); int studentCount = (int) classInfoRow.getCell(CLASS_INFO_COLS[2]).getNumericCellValue(); String monitor = classInfoRow.getCell(CLASS_INFO_COLS[3]).getStringCellValue(); for (int j = 4; j header.set(j, teacherName); } } for (int j = 1; j for (int j = headerRowNum + 1; j if (header.get(k).equals("学号")) { outputRow.createCell(k).setCellValue(studentId); } else if (header.get(k).equals("学生姓名")) { outputRow.createCell(k).setCellValue(studentName); } else if (header.get(k).equals("成绩")) { outputRow.createCell(k).setCellValue(score); } } } } } wb.close(); } catch (IOException e) { e.printStackTrace(); } } // 保存输出文件 try { outputWb.write(outputFile); outputWb.close(); } catch (IOException e) { e.printStackTrace(); } } }

本来接下来ChatGPT是输出解释上述生成代码的主要含义的,但它这句话还没说完输出就中断了,下面是对话截图: Java代码主要内容解释

于是我不得不自己输入命令来让它解释,结果可能我输入的命令不是很具体,它把每段代码输出下来,然后再对该段代码解释。我想要的是和它用Python编写代码时解释代码含义的格式一样,就是说几行到第几行,然后再解释。于是我再把命令输入详细点,如下图: 详细命令 这样解释就对了,如下:

第2-4行:导入所需的类和定义常量。

第6-13行:创建输出文件,并创建表头。其中,第9-11行根据要求创建了表头的前3列,而第12行根据表头数组的长度创建了剩余的列。

第15-22行:遍历文件夹中的Excel文件,并根据文件名的后缀名判断是否是Excel文件,如果不是就跳过。同时,使用一个变量rowNum来记录当前的行号,用于在输出文件中创建新的行。

第24-29行:打开Excel文件,并根据SHEET_NAMES数组中的名称来获取对应的Sheet对象。如果Sheet对象不存在,则跳过该Sheet。在读取完数据后,需要关闭Workbook对象,以释放资源。

第31-57行:获取表头和班级基本信息。其中,第31-44行获取表头,第46-60行获取班级基本信息,并根据表头中“教师姓名”这一列的位置来更新表头。然后根据学生人数在输出文件中创建相应数量的行,并将班级基本信息填充到这些行中。

第62-72行:获取成绩排名。其中,第62-68行遍历成绩排名Sheet中的每一行,获取学生的学号、姓名和成绩。然后在输出文件中创建新的行,并将学号、姓名和成绩填充到对应的列中。

五、GPT第二次生成Java代码

当第二次生成Java代码时,和第一次不一样了,用的方法也不一样了,相比第一次,代码量要少一些。所以问这个ChatGPT相同的问题并不一定有相同的回答。 第二次代码如下: 以下是实现上述要求的Java代码,其中进度条使用了Swing组件JProgressBar:

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.JProgressBar; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelMerger { private static final String[] SHEET_NAMES = {"班级基本信息", "班级学生成绩排名"}; private static final String[] HEADER = {"序号", "班级编号", "教师姓名", "班级人数", "班长", "学号", "学生姓名", "成绩"}; public static void mergeExcelFiles(String inputFolderPath, String outputFilePath, JProgressBar progressBar) throws IOException { List inputFiles = getExcelFiles(new File(inputFolderPath)); Workbook outputWorkbook = new XSSFWorkbook(); Sheet outputSheet = outputWorkbook.createSheet(); createHeaderRow(outputSheet); int rowNum = 1; for (int i = 0; i Sheet inputSheet = inputWorkbook.getSheet(SHEET_NAMES[j]); if (inputSheet == null) { continue; } if (j == 0) { mergeBasicInfo(inputSheet, outputSheet, rowNum); } else { mergeScoreRanking(inputSheet, outputSheet, rowNum); } } rowNum += getStudentCount(inputWorkbook); inputWorkbook.close(); progressBar.setValue((i + 1) * 100 / inputFiles.size()); } outputWorkbook.write(new FileOutputStream(outputFilePath)); outputWorkbook.close(); } private static List getExcelFiles(File folder) { List files = new ArrayList(); File[] allFiles = folder.listFiles(); for (File file : allFiles) { if (file.isFile() && file.getName().toLowerCase().endsWith(".xlsx")) { files.add(file); } } return files; } private static void createHeaderRow(Sheet sheet) { Row headerRow = sheet.createRow(0); for (int i = 0; i Row inputRow = inputSheet.getRow(1); Row outputRow = outputSheet.createRow(rowNum); outputRow.createCell(0).setCellValue(rowNum - 1); for (int i = 1; i int studentCount = inputSheet.getLastRowNum(); for (int i = 2; i Cell cell = outputRow.createCell(j); cell.setCellValue(inputSheet.getRow(1).getCell(j).getStringCellValue()); } for (int j = 5; j Sheet sheet = workbook.getSheet(SHEET_NAMES[0]); return (int) sheet.getRow(0).getCell(1).getNumericCellValue(); } }

主要代码解释:

第1行:定义常量SHEET_NAMES和HEADER。第3-11行:定义getExcelFiles方法,通过File类的listFiles方法获取指定文件夹下的所有Excel文件。第13-17行:定义createHeaderRow方法,创建合并后Excel文件的表头行。第19-35行:定义mergeBasicInfo方法,合并班级基本信息工作表。第37-57行:定义mergeScoreRanking方法,合并班级学生成绩排名工作表。第59-63行:定义getStudentCount方法,获取班级人数。第65-96行:定义mergeExcelFiles方法,对每个Excel文件进行合并,包括合并基本信息和成绩排名两个工作表,并将合并后的结果写入输出文件。在过程中使用进度条表示合并进度。 尾巴

本次的知识分享就到这了,谢谢你这么好看还关注我,我们下期再见!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有