Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to merge multiple workbook into one #1625

Closed
zsy619 opened this issue Aug 24, 2023 · 9 comments
Closed

How to merge multiple workbook into one #1625

zsy619 opened this issue Aug 24, 2023 · 9 comments

Comments

@zsy619
Copy link

zsy619 commented Aug 24, 2023

Description
如标题描述,求助。。。

Steps to reproduce the issue:

Describe the results you received:

Describe the results you expected:

Output of go version:

(paste your output here)

Excelize version or commit ID:

(paste here)

Environment details (OS, Microsoft Excel™ version, physical, etc.):

@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

@jinzhu

@xuri xuri closed this as completed Aug 24, 2023
@xuri
Copy link
Member

xuri commented Aug 24, 2023

Thanks for your issue. Excelize provides a set of functions that allow you to write to and read spreadsheets, please reference the documentation. You can open the source workbook by the OpenFile function, read each cell value by related functions, create a new workbook, set the cell value to the target workbook, and at last save the target workbook by the SaveAs function. I closed this issue, if you have any questions, please let me know, and reopen this any time.

@xuri xuri changed the title 如何合并多个excel文件到一个新文件 How to merge multiple workbook into one Aug 24, 2023
@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

CopySheet 我看有这个方法,能否实现拷贝到另外一个工作表中吗?
主要是合并之后的工作薄还要保持原有样式,如 计算公式、单元格背景、合并的单元格
要实现这个效果,如何操作?
@jinzhu

@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

@xuri @jinzhu 哥们,帮忙解决一下呀,急等,谢谢

@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

生成的excel文件提示:
image
代码如下:

        // 创建一个新的工作簿
	mergedFile := excelize.NewFile()
	for _, v := range list {
		// 读取 Excel 文件内容
		fileData, err := os.ReadFile("." + v.Template)
		if err != nil {
			fmt.Println("读取文件失败:", err)
			return
		}

		// 打开 Excel 文件
		xlsx, err := excelize.OpenReader(strings.NewReader(string(fileData)))
		if err != nil {
			fmt.Println("打开文件失败:", err)
			return
		}

		// 遍历每个工作表
		for _, sheetName := range xlsx.GetSheetList() {
			// rows, err := xlsx.GetRows(sheetName)
			// if err != nil {
			// 	fmt.Println("获取行数据失败:", err)
			// 	return
			// }
			from, err := xlsx.GetSheetIndex(sheetName)
			if err != nil {
				fmt.Println("获取工作表索引失败:", err)
				return
			}
			if err != nil {
				fmt.Println("复制工作表失败:", err)
				return
			}
			// 创建新的工作表
			newSheetName := sheetName
			mergedFile.NewSheet(newSheetName)
			err = xlsx.CloneSheet(from, mergedFile, newSheetName)
			if err != nil {
				fmt.Println("复制工作表失败:", err)
				return
			}

			// if opt, err := xlsx.GetSheetProps(sheetName); err != nil {
			// 	panic(err)
			// } else {
			// 	fmt.Println("opt=", opt)
			// 	mergedFile.SetSheetProps(newSheetName, &opt)
			// }

			// // 将当前工作表的行数据复制到合并文件的对应工作表中
			// for rowIndex, row := range rows {
			// 	rowIndexStr := fmt.Sprintf("%d", rowIndex+1)
			// 	mergedFile.SetSheetRow(sheetName, "A"+rowIndexStr, &row)
			// }
		}
	}
	// 删除默认的 Sheet1,并将第一个工作表设为默认工作表
	mergedFile.DeleteSheet("Sheet1")
	mergedFile.SetActiveSheet(0)
	// 保存合并后的 Excel 文件
	err = mergedFile.SaveAs("./downloads/merged.xlsx")
	if err != nil {
		this.JSONError(err.Error())
	}

@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

生成的xlsx文件,打开提示如下信息,而且显示空表格:
发现“merged.xlsx”中的部分内容有问题。是否让我们尽量尝试恢复? 如果您信任此工作簿的源,请单击“是”。

@zsy619
Copy link
Author

zsy619 commented Aug 24, 2023

@xuri 帮忙看看是什么问题

@zsy619
Copy link
Author

zsy619 commented Aug 25, 2023

@xuri @jinzhu 两位能否帮忙解决一下

@zsy619
Copy link
Author

zsy619 commented Aug 25, 2023

生成的excel文件提示: image 代码如下:

        // 创建一个新的工作簿
	mergedFile := excelize.NewFile()
	for _, v := range list {
		// 读取 Excel 文件内容
		fileData, err := os.ReadFile("." + v.Template)
		if err != nil {
			fmt.Println("读取文件失败:", err)
			return
		}

		// 打开 Excel 文件
		xlsx, err := excelize.OpenReader(strings.NewReader(string(fileData)))
		if err != nil {
			fmt.Println("打开文件失败:", err)
			return
		}

		// 遍历每个工作表
		for _, sheetName := range xlsx.GetSheetList() {
			// rows, err := xlsx.GetRows(sheetName)
			// if err != nil {
			// 	fmt.Println("获取行数据失败:", err)
			// 	return
			// }
			from, err := xlsx.GetSheetIndex(sheetName)
			if err != nil {
				fmt.Println("获取工作表索引失败:", err)
				return
			}
			if err != nil {
				fmt.Println("复制工作表失败:", err)
				return
			}
			// 创建新的工作表
			newSheetName := sheetName
			mergedFile.NewSheet(newSheetName)
			err = xlsx.CloneSheet(from, mergedFile, newSheetName)
			if err != nil {
				fmt.Println("复制工作表失败:", err)
				return
			}

			// if opt, err := xlsx.GetSheetProps(sheetName); err != nil {
			// 	panic(err)
			// } else {
			// 	fmt.Println("opt=", opt)
			// 	mergedFile.SetSheetProps(newSheetName, &opt)
			// }

			// // 将当前工作表的行数据复制到合并文件的对应工作表中
			// for rowIndex, row := range rows {
			// 	rowIndexStr := fmt.Sprintf("%d", rowIndex+1)
			// 	mergedFile.SetSheetRow(sheetName, "A"+rowIndexStr, &row)
			// }
		}
	}
	// 删除默认的 Sheet1,并将第一个工作表设为默认工作表
	mergedFile.DeleteSheet("Sheet1")
	mergedFile.SetActiveSheet(0)
	// 保存合并后的 Excel 文件
	err = mergedFile.SaveAs("./downloads/merged.xlsx")
	if err != nil {
		this.JSONError(err.Error())
	}

文件打开错误已解决,按照你们提交的issues https://go-review.googlesource.com/c/go/+/522316/1/src/encoding/xml/marshal.go#548 修改xml底层类库

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants