mirror of
https://github.com/ZeroHawkeye/wordZero.git
synced 2025-10-29 18:21:49 +08:00
更新README.md,新增表格功能和页面设置功能的详细描述;在document.go中添加文档主体元素接口及其实现,支持段落和表格元素类型。
This commit is contained in:
233
README.md
233
README.md
@@ -56,10 +56,102 @@ WordZero 是一个使用 Golang 实现的 Word 文档操作库,提供基础的
|
||||
### 🚧 规划中功能
|
||||
|
||||
#### 表格功能
|
||||
- [ ] 表格创建和管理
|
||||
- [ ] 单元格合并
|
||||
- [ ] 表格样式设置
|
||||
|
||||
##### 表格基础操作
|
||||
- [x] 表格创建和初始化
|
||||
- [x] 创建指定行列数的表格
|
||||
- [x] 设置表格初始数据
|
||||
- [x] 表格插入到文档指定位置
|
||||
- [x] 表格结构管理
|
||||
- [x] 插入行(指定位置、末尾、开头)
|
||||
- [x] 删除行(单行、多行、指定范围)
|
||||
- [x] 表格复制和剪切
|
||||
- [x] 表格删除和清空
|
||||
|
||||
##### 单元格操作
|
||||
- [x] 单元格内容管理
|
||||
- [x] 单元格文本设置和获取
|
||||
- [x] 单元格富文本格式支持
|
||||
- [x] 单元格内容清空和重置
|
||||
- [x] 单元格合并功能
|
||||
- [x] 横向合并(合并列)
|
||||
- [x] 纵向合并(合并行)
|
||||
- [x] 区域合并(多行多列)
|
||||
- [x] 取消合并操作
|
||||
- [x] 合并状态查询
|
||||
- [x] 单元格格式设置
|
||||
- [x] 单元格文字格式(字体、大小、颜色)
|
||||
- [x] 单元格对齐方式(水平、垂直对齐)
|
||||
- [x] 单元格文字方向和旋转
|
||||
- [x] 单元格内边距设置
|
||||
|
||||
##### 表格样式和外观
|
||||
- [ ] 表格整体样式
|
||||
- [ ] 预定义表格样式模板
|
||||
- [ ] 自定义表格样式创建
|
||||
- [ ] 表格主题色彩应用
|
||||
- [ ] 表格样式继承和覆盖
|
||||
- [ ] 表格边框设置
|
||||
- [ ] 外边框样式(线型、颜色、粗细)
|
||||
- [ ] 内边框样式(网格线设置)
|
||||
- [ ] 单元格边框独立设置
|
||||
- [ ] 边框部分应用(顶部、底部、左右)
|
||||
- [ ] 无边框表格支持
|
||||
- [ ] 表格背景和填充
|
||||
- [ ] 表格背景色设置
|
||||
- [ ] 单元格背景色设置
|
||||
- [ ] 奇偶行颜色交替
|
||||
- [ ] 渐变背景支持(基础渐变)
|
||||
- [ ] 图案填充支持
|
||||
|
||||
##### 表格布局和尺寸
|
||||
- [x] 表格尺寸控制
|
||||
- [x] 表格总宽度设置(固定宽度、相对宽度、自动宽度)
|
||||
- [x] 列宽设置(固定宽度、相对宽度、自动调整)
|
||||
- [ ] 行高设置(固定高度、最小高度、自动调整)
|
||||
- [x] 单元格尺寸精确控制
|
||||
- [ ] 表格对齐和定位
|
||||
- [x] 表格页面对齐(左对齐、居中、右对齐)
|
||||
- [ ] 表格文字环绕设置
|
||||
- [ ] 表格相对定位
|
||||
- [ ] 表格分页控制
|
||||
- [ ] 表格跨页处理
|
||||
- [ ] 标题行重复显示
|
||||
- [ ] 表格分页符控制
|
||||
- [ ] 避免分页的行设置
|
||||
|
||||
##### 表格数据处理
|
||||
- [x] 数据导入导出
|
||||
- [x] 二维数组数据绑定
|
||||
- [x] 表格数据提取为数组
|
||||
- [x] 批量数据填充
|
||||
- [ ] 表格排序功能(Word内置排序)
|
||||
- [ ] 单列排序(升序、降序)
|
||||
- [ ] 多列排序
|
||||
- [ ] 保持标题行不参与排序
|
||||
|
||||
##### 高级表格功能
|
||||
- [ ] 表格标题和说明
|
||||
- [ ] 表格标题设置(表格上方、下方)
|
||||
- [ ] 表格标题编号自动生成
|
||||
- [ ] 表格描述和备注
|
||||
- [ ] 嵌套表格支持
|
||||
- [ ] 单元格内嵌套表格
|
||||
- [ ] 嵌套表格独立样式
|
||||
- [ ] 表格模板功能
|
||||
- [ ] 常用表格模板库
|
||||
- [ ] 自定义模板保存
|
||||
- [ ] 模板快速应用
|
||||
|
||||
##### 表格访问和查询
|
||||
- [x] 表格查找和定位
|
||||
- [x] 按索引获取表格
|
||||
- [ ] 按标题查找表格
|
||||
- [x] 表格位置信息获取
|
||||
- [x] 单元格访问接口
|
||||
- [x] 按行列索引访问
|
||||
- [ ] 按范围批量访问
|
||||
- [ ] 单元格遍历迭代器
|
||||
|
||||
#### 图片功能
|
||||
- [ ] 图片插入
|
||||
@@ -67,6 +159,13 @@ WordZero 是一个使用 Golang 实现的 Word 文档操作库,提供基础的
|
||||
- [ ] 图片位置设置
|
||||
- [ ] 多种图片格式支持(JPG、PNG、GIF)
|
||||
|
||||
#### 页面设置功能
|
||||
- [ ] 页面大小设置(A4、Letter、Legal等标准尺寸)
|
||||
- [ ] 自定义页面尺寸
|
||||
- [ ] 页面方向设置(纵向/横向)
|
||||
- [ ] 页面边距设置(上下左右边距)
|
||||
- [ ] 页面分节和分页控制
|
||||
|
||||
#### 高级功能
|
||||
- [ ] 页眉页脚
|
||||
- [ ] 目录生成
|
||||
@@ -217,6 +316,121 @@ if err == nil {
|
||||
doc.Save("styled.docx")
|
||||
```
|
||||
|
||||
### 高级表格功能
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"github.com/ZeroHawkeye/wordZero/pkg/document"
|
||||
)
|
||||
|
||||
func main() {
|
||||
doc := document.New()
|
||||
|
||||
// 1. 创建基础表格
|
||||
config := &document.TableConfig{
|
||||
Rows: 4,
|
||||
Cols: 4,
|
||||
Width: 8000,
|
||||
Data: [][]string{
|
||||
{"学号", "姓名", "语文", "数学"},
|
||||
{"001", "张三", "85", "92"},
|
||||
{"002", "李四", "78", "88"},
|
||||
{"003", "王五", "90", "85"},
|
||||
},
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
|
||||
// 2. 设置表头格式
|
||||
headerFormat := &document.CellFormat{
|
||||
TextFormat: &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "FFFFFF", // 白色文字
|
||||
FontName: "微软雅黑",
|
||||
},
|
||||
HorizontalAlign: document.CellAlignCenter,
|
||||
VerticalAlign: document.CellVAlignCenter,
|
||||
}
|
||||
|
||||
// 为第一行设置表头格式
|
||||
for col := 0; col < 4; col++ {
|
||||
table.SetCellFormat(0, col, headerFormat)
|
||||
}
|
||||
|
||||
// 3. 单元格富文本
|
||||
table.SetCellFormattedText(1, 1, "张三", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontColor: "FF0000",
|
||||
})
|
||||
|
||||
// 在同一单元格添加不同格式的文本
|
||||
table.AddCellFormattedText(1, 1, " (优秀)", &document.TextFormat{
|
||||
Italic: true,
|
||||
FontColor: "00FF00",
|
||||
FontSize: 10,
|
||||
})
|
||||
|
||||
// 4. 单元格合并
|
||||
// 水平合并
|
||||
table.MergeCellsHorizontal(0, 2, 3) // 合并表头的"语文"和"数学"列
|
||||
table.SetCellText(0, 2, "成绩")
|
||||
|
||||
// 垂直合并
|
||||
table.MergeCellsVertical(1, 3, 0) // 合并学号列
|
||||
table.SetCellText(1, 0, "2024级")
|
||||
|
||||
// 区域合并(2x2区域)
|
||||
mergeTable := doc.AddTable(&document.TableConfig{Rows: 4, Cols: 4, Width: 6000})
|
||||
mergeTable.MergeCellsRange(1, 2, 1, 2) // 合并中间2x2区域
|
||||
mergeTable.SetCellText(1, 1, "合并区域")
|
||||
|
||||
// 5. 检查和取消合并
|
||||
isMerged, _ := table.IsCellMerged(0, 2)
|
||||
if isMerged {
|
||||
// 获取合并信息
|
||||
mergeInfo, _ := table.GetMergedCellInfo(0, 2)
|
||||
log.Printf("合并信息: %+v", mergeInfo)
|
||||
|
||||
// 可以选择取消合并
|
||||
// table.UnmergeCells(0, 2)
|
||||
}
|
||||
|
||||
// 6. 内容和格式操作
|
||||
// 清空内容但保留格式
|
||||
table.ClearCellContent(1, 2)
|
||||
table.SetCellText(1, 2, "90")
|
||||
|
||||
// 清空格式但保留内容
|
||||
table.ClearCellFormat(1, 3)
|
||||
|
||||
// 7. 设置单元格内边距
|
||||
table.SetCellPadding(0, 0, 10) // 10磅内边距
|
||||
|
||||
// 8. 设置单元格文字方向
|
||||
// 设置垂直文字(从上到下)
|
||||
table.SetCellTextDirection(1, 0, document.TextDirectionTB)
|
||||
|
||||
// 通过CellFormat设置完整格式,包括文字方向
|
||||
verticalFormat := &document.CellFormat{
|
||||
TextFormat: &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
},
|
||||
HorizontalAlign: document.CellAlignCenter,
|
||||
VerticalAlign: document.CellVAlignCenter,
|
||||
TextDirection: document.TextDirectionTB, // 从上到下
|
||||
}
|
||||
table.SetCellFormat(1, 1, verticalFormat)
|
||||
table.SetCellText(1, 1, "竖排文字")
|
||||
|
||||
doc.Save("advanced_table.docx")
|
||||
}
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
@@ -391,6 +605,19 @@ go tool cover -html=coverage.out
|
||||
|
||||
## 更新日志
|
||||
|
||||
### 2025-05-29 单元格文字方向功能实现
|
||||
- ✅ 实现单元格文字方向设置功能,支持6种方向:
|
||||
- `TextDirectionLR`:从左到右(默认)
|
||||
- `TextDirectionTB`:从上到下
|
||||
- `TextDirectionBT`:从下到上
|
||||
- `TextDirectionRL`:从右到左
|
||||
- `TextDirectionTBV`:从上到下,垂直显示
|
||||
- `TextDirectionBTV`:从下到上,垂直显示
|
||||
- ✅ 添加 `SetCellTextDirection()` 和 `GetCellTextDirection()` 方法
|
||||
- ✅ 扩展 `CellFormat` 结构支持文字方向属性
|
||||
- ✅ 添加完整的测试用例和演示程序
|
||||
- ✅ 更新README文档和使用示例
|
||||
|
||||
### 2025-05-29 测试修复
|
||||
- ✅ 修复 `TestComplexDocument` 测试:调整期望段落数量从7改为6,与实际创建的段落数量一致
|
||||
- ✅ 修复 `TestErrorHandling` 测试:改进无效路径测试策略,确保在不同操作系统下都能正确测试错误处理
|
||||
|
||||
373
examples/cell_advanced/main.go
Normal file
373
examples/cell_advanced/main.go
Normal file
@@ -0,0 +1,373 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/ZeroHawkeye/wordZero/pkg/document"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建新文档
|
||||
doc := document.New()
|
||||
|
||||
fmt.Println("=== 演示高级单元格操作功能 ===")
|
||||
|
||||
// 1. 创建表格
|
||||
fmt.Println("\n1. 创建基础表格...")
|
||||
config := &document.TableConfig{
|
||||
Rows: 4,
|
||||
Cols: 4,
|
||||
Width: 8000,
|
||||
Data: [][]string{
|
||||
{"学号", "姓名", "语文", "数学"},
|
||||
{"001", "张三", "85", "92"},
|
||||
{"002", "李四", "78", "88"},
|
||||
{"003", "王五", "90", "85"},
|
||||
},
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
if table == nil {
|
||||
log.Fatal("创建表格失败")
|
||||
}
|
||||
|
||||
// 2. 设置表头格式
|
||||
fmt.Println("2. 设置表头格式...")
|
||||
headerFormat := &document.CellFormat{
|
||||
TextFormat: &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "FFFFFF", // 白色文字
|
||||
FontName: "微软雅黑",
|
||||
},
|
||||
HorizontalAlign: document.CellAlignCenter,
|
||||
VerticalAlign: document.CellVAlignCenter,
|
||||
}
|
||||
|
||||
// 为第一行的每个单元格设置表头格式
|
||||
for col := 0; col < 4; col++ {
|
||||
err := table.SetCellFormat(0, col, headerFormat)
|
||||
if err != nil {
|
||||
log.Printf("设置表头格式失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 设置数据行格式
|
||||
fmt.Println("3. 设置数据行格式...")
|
||||
dataFormat := &document.CellFormat{
|
||||
TextFormat: &document.TextFormat{
|
||||
FontSize: 12,
|
||||
FontName: "宋体",
|
||||
},
|
||||
HorizontalAlign: document.CellAlignCenter,
|
||||
VerticalAlign: document.CellVAlignCenter,
|
||||
}
|
||||
|
||||
// 为数据行设置格式
|
||||
for row := 1; row < 4; row++ {
|
||||
for col := 0; col < 4; col++ {
|
||||
err := table.SetCellFormat(row, col, dataFormat)
|
||||
if err != nil {
|
||||
log.Printf("设置数据格式失败: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 演示富文本单元格
|
||||
fmt.Println("4. 添加富文本单元格...")
|
||||
|
||||
// 在表格下方添加一个新表格用于演示富文本
|
||||
richTextConfig := &document.TableConfig{
|
||||
Rows: 2,
|
||||
Cols: 3,
|
||||
Width: 8000,
|
||||
}
|
||||
|
||||
richTable := doc.AddTable(richTextConfig)
|
||||
|
||||
// 在同一个单元格中添加不同格式的文本
|
||||
err := richTable.SetCellFormattedText(0, 0, "标题:", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置富文本失败: %v", err)
|
||||
}
|
||||
|
||||
err = richTable.AddCellFormattedText(0, 0, "重要信息", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontColor: "FF0000", // 红色
|
||||
FontSize: 12,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("添加富文本失败: %v", err)
|
||||
}
|
||||
|
||||
err = richTable.AddCellFormattedText(0, 0, "(普通文本)", &document.TextFormat{
|
||||
FontSize: 10,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("添加富文本失败: %v", err)
|
||||
}
|
||||
|
||||
// 5. 演示单元格合并
|
||||
fmt.Println("5. 演示单元格合并...")
|
||||
|
||||
// 创建合并演示表格
|
||||
mergeConfig := &document.TableConfig{
|
||||
Rows: 5,
|
||||
Cols: 5,
|
||||
Width: 8000,
|
||||
}
|
||||
|
||||
mergeTable := doc.AddTable(mergeConfig)
|
||||
|
||||
// 设置初始数据
|
||||
for row := 0; row < 5; row++ {
|
||||
for col := 0; col < 5; col++ {
|
||||
text := fmt.Sprintf("R%dC%d", row+1, col+1)
|
||||
err := mergeTable.SetCellText(row, col, text)
|
||||
if err != nil {
|
||||
log.Printf("设置单元格文本失败: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 水平合并:合并第一行的第2-4列
|
||||
err = mergeTable.MergeCellsHorizontal(0, 1, 3)
|
||||
if err != nil {
|
||||
log.Printf("水平合并失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置合并单元格的内容
|
||||
err = mergeTable.SetCellFormattedText(0, 1, "水平合并单元格", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "0000FF",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置合并单元格内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 垂直合并:合并第一列的第2-4行
|
||||
err = mergeTable.MergeCellsVertical(1, 3, 0)
|
||||
if err != nil {
|
||||
log.Printf("垂直合并失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置垂直合并单元格的内容
|
||||
err = mergeTable.SetCellFormattedText(1, 0, "垂直合并", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "00FF00",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置垂直合并单元格内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 区域合并:合并右下角2x2区域
|
||||
err = mergeTable.MergeCellsRange(3, 4, 3, 4)
|
||||
if err != nil {
|
||||
log.Printf("区域合并失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置区域合并单元格的内容
|
||||
err = mergeTable.SetCellFormattedText(3, 3, "区域合并", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "FF00FF",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置区域合并单元格内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 6. 检查合并状态
|
||||
fmt.Println("6. 检查合并状态...")
|
||||
|
||||
mergeInfo, err := mergeTable.GetMergedCellInfo(0, 1)
|
||||
if err != nil {
|
||||
log.Printf("获取合并信息失败: %v", err)
|
||||
} else {
|
||||
fmt.Printf("单元格(0,1)合并信息: %+v\n", mergeInfo)
|
||||
}
|
||||
|
||||
// 7. 演示单元格内容和格式操作
|
||||
fmt.Println("7. 演示内容和格式操作...")
|
||||
|
||||
// 创建操作演示表格
|
||||
opConfig := &document.TableConfig{
|
||||
Rows: 3,
|
||||
Cols: 3,
|
||||
Width: 6000,
|
||||
}
|
||||
|
||||
opTable := doc.AddTable(opConfig)
|
||||
|
||||
// 设置带格式的内容
|
||||
err = opTable.SetCellFormattedText(0, 0, "原始内容", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 14,
|
||||
FontColor: "FF0000",
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置格式化内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 清空内容但保留格式
|
||||
err = opTable.ClearCellContent(0, 1)
|
||||
if err != nil {
|
||||
log.Printf("清空内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置新内容
|
||||
err = opTable.SetCellText(0, 1, "新内容")
|
||||
if err != nil {
|
||||
log.Printf("设置新内容失败: %v", err)
|
||||
}
|
||||
|
||||
// 清空格式但保留内容
|
||||
err = opTable.ClearCellFormat(0, 2)
|
||||
if err != nil {
|
||||
log.Printf("清空格式失败: %v", err)
|
||||
}
|
||||
|
||||
// 8. 保存文档
|
||||
fmt.Println("8. 保存文档...")
|
||||
|
||||
// 添加说明段落
|
||||
doc.AddParagraph("本文档演示了wordZero库的高级单元格操作功能:")
|
||||
doc.AddParagraph("1. 第一个表格展示了基础表格创建和格式设置")
|
||||
doc.AddParagraph("2. 第二个表格展示了富文本单元格功能")
|
||||
doc.AddParagraph("3. 第三个表格展示了单元格合并功能")
|
||||
doc.AddParagraph("4. 第四个表格展示了内容和格式操作功能")
|
||||
|
||||
// 9. 演示文字方向功能
|
||||
fmt.Println("9. 演示文字方向功能...")
|
||||
|
||||
// 添加文字方向演示说明
|
||||
doc.AddParagraph("")
|
||||
doc.AddParagraph("=== 单元格文字方向演示 ===")
|
||||
|
||||
// 创建文字方向演示表格
|
||||
directionConfig := &document.TableConfig{
|
||||
Rows: 3,
|
||||
Cols: 3,
|
||||
Width: 8000,
|
||||
}
|
||||
|
||||
directionTable := doc.AddTable(directionConfig)
|
||||
|
||||
// 演示不同的文字方向
|
||||
directions := []struct {
|
||||
name string
|
||||
direction document.CellTextDirection
|
||||
row int
|
||||
col int
|
||||
}{
|
||||
{"水平从左到右", document.TextDirectionLR, 0, 0},
|
||||
{"垂直从上到下", document.TextDirectionTB, 0, 1},
|
||||
{"垂直从下到上", document.TextDirectionBT, 0, 2},
|
||||
{"水平从右到左", document.TextDirectionRL, 1, 0},
|
||||
{"垂直显示上下", document.TextDirectionTBV, 1, 1},
|
||||
{"垂直显示下上", document.TextDirectionBTV, 1, 2},
|
||||
{"混合格式文字", document.TextDirectionTB, 2, 0},
|
||||
{"居中垂直文字", document.TextDirectionTB, 2, 1},
|
||||
{"默认方向", document.TextDirectionLR, 2, 2},
|
||||
}
|
||||
|
||||
for _, dir := range directions {
|
||||
// 设置单元格文字
|
||||
err := directionTable.SetCellText(dir.row, dir.col, dir.name)
|
||||
if err != nil {
|
||||
log.Printf("设置单元格文字失败: %v", err)
|
||||
}
|
||||
|
||||
// 设置文字方向
|
||||
err = directionTable.SetCellTextDirection(dir.row, dir.col, dir.direction)
|
||||
if err != nil {
|
||||
log.Printf("设置文字方向失败: %v", err)
|
||||
}
|
||||
|
||||
// 为某些特殊单元格添加格式
|
||||
if dir.row == 2 && dir.col == 0 {
|
||||
// 混合格式演示
|
||||
err = directionTable.SetCellFormattedText(dir.row, dir.col, "混合", &document.TextFormat{
|
||||
Bold: true,
|
||||
FontColor: "FF0000",
|
||||
FontSize: 14,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("设置富文本失败: %v", err)
|
||||
}
|
||||
|
||||
err = directionTable.AddCellFormattedText(dir.row, dir.col, "格式", &document.TextFormat{
|
||||
Italic: true,
|
||||
FontColor: "0000FF",
|
||||
FontSize: 12,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("添加富文本失败: %v", err)
|
||||
}
|
||||
|
||||
err = directionTable.AddCellFormattedText(dir.row, dir.col, "文字", &document.TextFormat{
|
||||
FontColor: "00FF00",
|
||||
FontSize: 10,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("添加富文本失败: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if dir.row == 2 && dir.col == 1 {
|
||||
// 居中垂直文字
|
||||
format := &document.CellFormat{
|
||||
TextFormat: &document.TextFormat{
|
||||
Bold: true,
|
||||
FontSize: 16,
|
||||
},
|
||||
HorizontalAlign: document.CellAlignCenter,
|
||||
VerticalAlign: document.CellVAlignCenter,
|
||||
TextDirection: document.TextDirectionTB,
|
||||
}
|
||||
|
||||
err = directionTable.SetCellFormat(dir.row, dir.col, format)
|
||||
if err != nil {
|
||||
log.Printf("设置单元格格式失败: %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 验证文字方向设置
|
||||
fmt.Println("10. 验证文字方向设置...")
|
||||
for _, dir := range directions {
|
||||
actualDirection, err := directionTable.GetCellTextDirection(dir.row, dir.col)
|
||||
if err != nil {
|
||||
log.Printf("获取文字方向失败: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
if actualDirection == dir.direction {
|
||||
fmt.Printf("✓ 单元格(%d,%d) 文字方向设置正确: %s\n", dir.row, dir.col, dir.direction)
|
||||
} else {
|
||||
fmt.Printf("✗ 单元格(%d,%d) 文字方向不匹配,期望: %s,实际: %s\n",
|
||||
dir.row, dir.col, dir.direction, actualDirection)
|
||||
}
|
||||
}
|
||||
|
||||
// 11. 保存文档
|
||||
fmt.Println("11. 保存文档...")
|
||||
|
||||
// 更新说明
|
||||
doc.AddParagraph("• 单元格文字方向设置(支持6种方向)")
|
||||
doc.AddParagraph("• 文字方向与其他格式的组合使用")
|
||||
|
||||
filename := "../output/cell_advanced_demo.docx"
|
||||
err = doc.Save(filename)
|
||||
if err != nil {
|
||||
log.Fatalf("保存文档失败: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("文档已保存为: %s\n", filename)
|
||||
fmt.Println("=== 演示完成 ===")
|
||||
}
|
||||
270
examples/table/table_example.go
Normal file
270
examples/table/table_example.go
Normal file
@@ -0,0 +1,270 @@
|
||||
// Package main 演示WordZero表格功能
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"github.com/ZeroHawkeye/wordZero/pkg/document"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("=== WordZero 表格功能演示 ===")
|
||||
|
||||
// 创建新文档
|
||||
doc := document.New()
|
||||
|
||||
// 添加文档标题
|
||||
title := doc.AddParagraph("WordZero 表格功能演示")
|
||||
title.SetAlignment(document.AlignCenter)
|
||||
|
||||
// 演示1:创建基础表格
|
||||
fmt.Println("1. 创建基础表格...")
|
||||
demonstrateBasicTable(doc)
|
||||
|
||||
// 演示2:表格数据操作
|
||||
fmt.Println("2. 演示表格数据操作...")
|
||||
demonstrateTableDataOperations(doc)
|
||||
|
||||
// 演示3:表格结构操作
|
||||
fmt.Println("3. 演示表格结构操作...")
|
||||
demonstrateTableStructureOperations(doc)
|
||||
|
||||
// 演示4:表格复制和清空
|
||||
fmt.Println("4. 演示表格复制和清空...")
|
||||
demonstrateTableCopyAndClear(doc)
|
||||
|
||||
// 演示5:表格删除操作
|
||||
fmt.Println("5. 演示表格删除操作...")
|
||||
demonstrateTableDeletion(doc)
|
||||
|
||||
// 保存文档
|
||||
outputFile := "../output/table_demo.docx"
|
||||
err := doc.Save(outputFile)
|
||||
if err != nil {
|
||||
log.Fatalf("保存文档失败: %v", err)
|
||||
}
|
||||
|
||||
fmt.Printf("表格演示文档已保存到: %s\n", outputFile)
|
||||
fmt.Println("=== 演示完成 ===")
|
||||
}
|
||||
|
||||
// demonstrateBasicTable 演示基础表格创建
|
||||
func demonstrateBasicTable(doc *document.Document) {
|
||||
doc.AddParagraph("1. 基础表格创建")
|
||||
|
||||
// 创建一个3x4的表格,包含初始数据
|
||||
tableData := [][]string{
|
||||
{"姓名", "年龄", "职位", "部门"},
|
||||
{"张三", "28", "工程师", "技术部"},
|
||||
{"李四", "32", "经理", "销售部"},
|
||||
}
|
||||
|
||||
config := &document.TableConfig{
|
||||
Rows: 3,
|
||||
Cols: 4,
|
||||
Width: 8000, // 8000磅宽度
|
||||
Data: tableData,
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
if table != nil {
|
||||
fmt.Printf(" 创建表格成功:%dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
doc.AddParagraph("") // 空行分隔
|
||||
}
|
||||
|
||||
// demonstrateTableDataOperations 演示表格数据操作
|
||||
func demonstrateTableDataOperations(doc *document.Document) {
|
||||
doc.AddParagraph("2. 表格数据操作")
|
||||
|
||||
// 创建一个简单的2x3表格
|
||||
config := &document.TableConfig{
|
||||
Rows: 2,
|
||||
Cols: 3,
|
||||
Width: 6000,
|
||||
Data: [][]string{
|
||||
{"产品", "价格", "库存"},
|
||||
{"笔记本", "5000", "50"},
|
||||
},
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
if table == nil {
|
||||
fmt.Println(" 创建表格失败")
|
||||
return
|
||||
}
|
||||
|
||||
// 设置单元格内容
|
||||
err := table.SetCellText(0, 0, "商品名称")
|
||||
if err != nil {
|
||||
fmt.Printf(" 设置单元格失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Println(" 设置单元格内容成功")
|
||||
}
|
||||
|
||||
// 获取单元格内容
|
||||
cellText, err := table.GetCellText(1, 1)
|
||||
if err != nil {
|
||||
fmt.Printf(" 获取单元格失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 单元格(1,1)内容: %s\n", cellText)
|
||||
}
|
||||
|
||||
doc.AddParagraph("") // 空行分隔
|
||||
}
|
||||
|
||||
// demonstrateTableStructureOperations 演示表格结构操作
|
||||
func demonstrateTableStructureOperations(doc *document.Document) {
|
||||
doc.AddParagraph("3. 表格结构操作")
|
||||
|
||||
// 创建基础表格
|
||||
config := &document.TableConfig{
|
||||
Rows: 2,
|
||||
Cols: 2,
|
||||
Width: 4000,
|
||||
Data: [][]string{
|
||||
{"A1", "B1"},
|
||||
{"A2", "B2"},
|
||||
},
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
if table == nil {
|
||||
fmt.Println(" 创建表格失败")
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf(" 初始表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
|
||||
// 插入行
|
||||
err := table.InsertRow(1, []string{"A1.5", "B1.5"})
|
||||
if err != nil {
|
||||
fmt.Printf(" 插入行失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 插入行后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
// 添加行到末尾
|
||||
err = table.AppendRow([]string{"A末", "B末"})
|
||||
if err != nil {
|
||||
fmt.Printf(" 添加行失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 添加行后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
// 插入列
|
||||
err = table.InsertColumn(1, []string{"C1", "C1.5", "C2", "C末"}, 1000)
|
||||
if err != nil {
|
||||
fmt.Printf(" 插入列失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 插入列后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
// 添加列到末尾
|
||||
err = table.AppendColumn([]string{"D1", "D1.5", "D2", "D末"}, 1000)
|
||||
if err != nil {
|
||||
fmt.Printf(" 添加列失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 添加列后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
doc.AddParagraph("") // 空行分隔
|
||||
}
|
||||
|
||||
// demonstrateTableCopyAndClear 演示表格复制和清空
|
||||
func demonstrateTableCopyAndClear(doc *document.Document) {
|
||||
doc.AddParagraph("4. 表格复制和清空")
|
||||
|
||||
// 创建源表格
|
||||
config := &document.TableConfig{
|
||||
Rows: 2,
|
||||
Cols: 2,
|
||||
Width: 4000,
|
||||
Data: [][]string{
|
||||
{"原始1", "原始2"},
|
||||
{"原始3", "原始4"},
|
||||
},
|
||||
}
|
||||
|
||||
sourceTable := doc.AddTable(config)
|
||||
if sourceTable == nil {
|
||||
fmt.Println(" 创建源表格失败")
|
||||
return
|
||||
}
|
||||
|
||||
// 复制表格
|
||||
copiedTable := sourceTable.CopyTable()
|
||||
if copiedTable != nil {
|
||||
fmt.Println(" 表格复制成功")
|
||||
|
||||
// 修改复制的表格内容以区分
|
||||
copiedTable.SetCellText(0, 0, "复制1")
|
||||
copiedTable.SetCellText(0, 1, "复制2")
|
||||
copiedTable.SetCellText(1, 0, "复制3")
|
||||
copiedTable.SetCellText(1, 1, "复制4")
|
||||
|
||||
// 将复制的表格添加到文档
|
||||
doc.Body.Tables = append(doc.Body.Tables, *copiedTable)
|
||||
fmt.Println(" 复制的表格已添加到文档")
|
||||
}
|
||||
|
||||
// 清空原表格内容
|
||||
sourceTable.ClearTable()
|
||||
fmt.Println(" 原表格内容已清空")
|
||||
|
||||
doc.AddParagraph("") // 空行分隔
|
||||
}
|
||||
|
||||
// demonstrateTableDeletion 演示表格删除操作
|
||||
func demonstrateTableDeletion(doc *document.Document) {
|
||||
doc.AddParagraph("5. 表格删除操作")
|
||||
|
||||
// 创建测试表格
|
||||
config := &document.TableConfig{
|
||||
Rows: 4,
|
||||
Cols: 4,
|
||||
Width: 6000,
|
||||
Data: [][]string{
|
||||
{"1", "2", "3", "4"},
|
||||
{"5", "6", "7", "8"},
|
||||
{"9", "10", "11", "12"},
|
||||
{"13", "14", "15", "16"},
|
||||
},
|
||||
}
|
||||
|
||||
table := doc.AddTable(config)
|
||||
if table == nil {
|
||||
fmt.Println(" 创建测试表格失败")
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf(" 初始表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
|
||||
// 删除第2行(索引1)
|
||||
err := table.DeleteRow(1)
|
||||
if err != nil {
|
||||
fmt.Printf(" 删除行失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 删除行后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
// 删除第2列(索引1)
|
||||
err = table.DeleteColumn(1)
|
||||
if err != nil {
|
||||
fmt.Printf(" 删除列失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 删除列后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
// 删除多行(索引1到2)
|
||||
err = table.DeleteRows(1, 2)
|
||||
if err != nil {
|
||||
fmt.Printf(" 删除多行失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf(" 删除多行后表格大小: %dx%d\n", table.GetRowCount(), table.GetColumnCount())
|
||||
}
|
||||
|
||||
doc.AddParagraph("") // 空行分隔
|
||||
}
|
||||
@@ -33,6 +33,22 @@ type Document struct {
|
||||
type Body struct {
|
||||
XMLName xml.Name `xml:"w:body"`
|
||||
Paragraphs []Paragraph `xml:"w:p"`
|
||||
Tables []Table `xml:"w:tbl"`
|
||||
}
|
||||
|
||||
// BodyElement 文档主体元素接口
|
||||
type BodyElement interface {
|
||||
ElementType() string
|
||||
}
|
||||
|
||||
// ElementType 返回段落元素类型
|
||||
func (p *Paragraph) ElementType() string {
|
||||
return "paragraph"
|
||||
}
|
||||
|
||||
// ElementType 返回表格元素类型
|
||||
func (t *Table) ElementType() string {
|
||||
return "table"
|
||||
}
|
||||
|
||||
// Paragraph 表示一个段落
|
||||
|
||||
1270
pkg/document/table.go
Normal file
1270
pkg/document/table.go
Normal file
File diff suppressed because it is too large
Load Diff
1223
pkg/document/table_test.go
Normal file
1223
pkg/document/table_test.go
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user