下列代码有点长,不知好不好简化,请高手赐教,谢谢!
CLEAR ALL
CLOSE ALL
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
wjm=cPath+"\销售明细表.xls"
FileName=cPath+"\"+"销售统计表.doc"
* 创建Word应用程序对象
oWord = CREATEOBJECT("Word.Application")
oWord.Visible = .T.
* 创建新文档
oDoc = oWord.Documents.Add()
* 添加标题
oWord.Documents(1).range.Text = "销售统计表"
oWord.Documents(1).range.Font.Size = 16
oWord.Documents(1).range.Font.Bold = .T.
oWord.Documents(1).range.Font.Name="宋体"
oWord.Documents(1).range.ParagraphFormat.Alignment = 1
* 连接Excel并读取数据
oExcel = CREATEOBJECT("Excel.Application")
oExcel.Visible = .F.
oWorkbook = oExcel.Workbooks.Open(wjm)
oSheet = oWorkbook.ActiveSheet
* 获取数据范围
nLastRow = oSheet.UsedRange.Rows.Count
* 创建临时表来存储Excel数据
CREATE CURSOR temp_data (订单号 C(10), 产品 C(20), 区域 C(10), 数量 N(5), 金额 N(10,2))
* 将Excel数据导入临时表
FOR i = 2 TO nLastRow
lcOrder = ALLTRIM(TRANSFORM(oSheet.Cells(i, 1).Value))
lcProduct = ALLTRIM(TRANSFORM(oSheet.Cells(i, 2).Value))
lcArea = ALLTRIM(TRANSFORM(oSheet.Cells(i, 3).Value))
* 获取金额
lnQty = 0
lnAmount = 0
* 处理数量
lcQtyValue = TRANSFORM(oSheet.Cells(i, 4).Value)
IF VARTYPE(lcQtyValue) = "C" AND !EMPTY(lcQtyValue)
lnQty = VAL(lcQtyValue)
ELSE
lnQty = oSheet.Cells(i, 4).Value
ENDIF
* 处理金额
lcAmountValue = TRANSFORM(oSheet.Cells(i, 5).Value)
IF VARTYPE(lcAmountValue) = "C" AND !EMPTY(lcAmountValue)
lnAmount = VAL(lcAmountValue)
ELSE
lnAmount = oSheet.Cells(i, 5).Value
ENDIF
INSERT INTO temp_data VALUES (lcOrder, lcProduct, lcArea, lnQty, lnAmount)
ENDFOR
* 获取所有不重复的区域
SELECT DISTINCT 区域 FROM temp_data INTO CURSOR cur_areas ORDER BY 区域
* 获取所有不重复的产品
SELECT DISTINCT 产品 FROM temp_data INTO CURSOR cur_products ORDER BY 产品
* 创建Word表格
nRows = RECCOUNT("cur_products") + 2 && 产品行 + 标题行 + 总计行
nCols = RECCOUNT("cur_areas") + 2 && 区域列 + 产品列 + 合计列
oTable = oDoc.Tables.Add(oDoc.Range(oDoc.Range.End-1, oDoc.Range.End-1), nRows, nCols)
oTable.Style = "网格型"
oWord.ActiveDocument.Tables(1).Range.Font.Bold=.F.
oWord.ActiveDocument.Tables(1).Range.Font.size=11
oWord.ActiveDocument.Tables(1).Range.Font.Name="宋体"
oWord.ActiveDocument.Tables(1).Rows(1).Range.Font.Bold=.t.
* 填充表头
oTable.Cell(1, 1).Range.Text = "产品"
SELECT cur_areas
nCol = 2
SCAN
oTable.Cell(1, nCol).Range.Text = ALLTRIM(区域)
nCol = nCol + 1
ENDSCAN
oTable.Cell(1, nCols).Range.Text = "合计"
* 填充产品数据
SELECT cur_products
nRow = 2
SCAN
lcProduct = ALLTRIM(产品)
oTable.Cell(nRow, 1).Range.Text = lcProduct
* 计算每个区域的金额
SELECT cur_areas
nCol = 2
SCAN
lcArea = ALLTRIM(区域)
* 使用SQL查询计算金额 - 这是更可靠的方法
SELECT SUM(金额) AS area_sum FROM temp_data ;
WHERE ALLTRIM(产品) == lcProduct AND ALLTRIM(区域) == lcArea ;
INTO CURSOR temp_area_sum
IF _TALLY > 0 AND !ISNULL(temp_area_sum.area_sum)
oTable.Cell(nRow, nCol).Range.Text = ALLTRIM(STR(temp_area_sum.area_sum, 10, 2))
ELSE
oTable.Cell(nRow, nCol).Range.Text = " "
ENDIF
nCol = nCol + 1
USE IN temp_area_sum
ENDSCAN
* 计算产品合计
SELECT SUM(金额) AS product_sum FROM temp_data ;
WHERE ALLTRIM(产品) == lcProduct ;
INTO CURSOR temp_product_sum
IF _TALLY > 0 AND !ISNULL(temp_product_sum.product_sum)
oTable.Cell(nRow, nCols).Range.Text = ALLTRIM(STR(temp_product_sum.product_sum, 10, 2))
ELSE
oTable.Cell(nRow, nCols).Range.Text = "0.00"
ENDIF
nRow = nRow + 1
USE IN temp_product_sum
ENDSCAN
* 添加总计行
oTable.Cell(nRows, 1).Range.Text = "总计"
* 计算每个区域的总计
SELECT cur_areas
nCol = 2
SCAN
lcArea = ALLTRIM(区域)
SELECT SUM(金额) AS area_total FROM temp_data ;
WHERE ALLTRIM(区域) == lcArea ;
INTO CURSOR temp_area_total
IF _TALLY > 0 AND !ISNULL(temp_area_total.area_total)
oTable.Cell(nRows, nCol).Range.Text = ALLTRIM(STR(temp_area_total.area_total, 10, 2))
ELSE
oTable.Cell(nRows, nCol).Range.Text = "0.00"
ENDIF
nCol = nCol + 1
USE IN temp_area_total
ENDSCAN
* 计算整体总计
SELECT SUM(金额) AS grand_total FROM temp_data INTO CURSOR temp_grand
IF _TALLY > 0 AND !ISNULL(temp_grand.grand_total)
oTable.Cell(nRows, nCols).Range.Text = ALLTRIM(STR(temp_grand.grand_total, 10, 2))
ELSE
oTable.Cell(nRows, nCols).Range.Text = "0.00"
ENDIF
* 关闭Excel
oWorkbook.Close(.F.)
oExcel.Quit()
* 保存Word文档
oDoc.SaveAs(FileName)
* 清理对象
RELEASE oSheet, oWorkbook, oExcel
RELEASE oTable, oDoc, oWord
USE IN temp_data
USE IN cur_areas
USE IN cur_products
USE IN temp_grand
MESSAGEBOX("Word格式的销售统计表生成完成!", 64, "完成")
CLEAR ALL
CLOSE ALL
cPath=ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cPath)
wjm=cPath+"\销售明细表.xls"
FileName=cPath+"\"+"销售统计表.doc"
* 创建Word应用程序对象
oWord = CREATEOBJECT("Word.Application")
oWord.Visible = .T.
* 创建新文档
oDoc = oWord.Documents.Add()
* 添加标题
oWord.Documents(1).range.Text = "销售统计表"
oWord.Documents(1).range.Font.Size = 16
oWord.Documents(1).range.Font.Bold = .T.
oWord.Documents(1).range.Font.Name="宋体"
oWord.Documents(1).range.ParagraphFormat.Alignment = 1
* 连接Excel并读取数据
oExcel = CREATEOBJECT("Excel.Application")
oExcel.Visible = .F.
oWorkbook = oExcel.Workbooks.Open(wjm)
oSheet = oWorkbook.ActiveSheet
* 获取数据范围
nLastRow = oSheet.UsedRange.Rows.Count
* 创建临时表来存储Excel数据
CREATE CURSOR temp_data (订单号 C(10), 产品 C(20), 区域 C(10), 数量 N(5), 金额 N(10,2))
* 将Excel数据导入临时表
FOR i = 2 TO nLastRow
lcOrder = ALLTRIM(TRANSFORM(oSheet.Cells(i, 1).Value))
lcProduct = ALLTRIM(TRANSFORM(oSheet.Cells(i, 2).Value))
lcArea = ALLTRIM(TRANSFORM(oSheet.Cells(i, 3).Value))
* 获取金额
lnQty = 0
lnAmount = 0
* 处理数量
lcQtyValue = TRANSFORM(oSheet.Cells(i, 4).Value)
IF VARTYPE(lcQtyValue) = "C" AND !EMPTY(lcQtyValue)
lnQty = VAL(lcQtyValue)
ELSE
lnQty = oSheet.Cells(i, 4).Value
ENDIF
* 处理金额
lcAmountValue = TRANSFORM(oSheet.Cells(i, 5).Value)
IF VARTYPE(lcAmountValue) = "C" AND !EMPTY(lcAmountValue)
lnAmount = VAL(lcAmountValue)
ELSE
lnAmount = oSheet.Cells(i, 5).Value
ENDIF
INSERT INTO temp_data VALUES (lcOrder, lcProduct, lcArea, lnQty, lnAmount)
ENDFOR
* 获取所有不重复的区域
SELECT DISTINCT 区域 FROM temp_data INTO CURSOR cur_areas ORDER BY 区域
* 获取所有不重复的产品
SELECT DISTINCT 产品 FROM temp_data INTO CURSOR cur_products ORDER BY 产品
* 创建Word表格
nRows = RECCOUNT("cur_products") + 2 && 产品行 + 标题行 + 总计行
nCols = RECCOUNT("cur_areas") + 2 && 区域列 + 产品列 + 合计列
oTable = oDoc.Tables.Add(oDoc.Range(oDoc.Range.End-1, oDoc.Range.End-1), nRows, nCols)
oTable.Style = "网格型"
oWord.ActiveDocument.Tables(1).Range.Font.Bold=.F.
oWord.ActiveDocument.Tables(1).Range.Font.size=11
oWord.ActiveDocument.Tables(1).Range.Font.Name="宋体"
oWord.ActiveDocument.Tables(1).Rows(1).Range.Font.Bold=.t.
* 填充表头
oTable.Cell(1, 1).Range.Text = "产品"
SELECT cur_areas
nCol = 2
SCAN
oTable.Cell(1, nCol).Range.Text = ALLTRIM(区域)
nCol = nCol + 1
ENDSCAN
oTable.Cell(1, nCols).Range.Text = "合计"
* 填充产品数据
SELECT cur_products
nRow = 2
SCAN
lcProduct = ALLTRIM(产品)
oTable.Cell(nRow, 1).Range.Text = lcProduct
* 计算每个区域的金额
SELECT cur_areas
nCol = 2
SCAN
lcArea = ALLTRIM(区域)
* 使用SQL查询计算金额 - 这是更可靠的方法
SELECT SUM(金额) AS area_sum FROM temp_data ;
WHERE ALLTRIM(产品) == lcProduct AND ALLTRIM(区域) == lcArea ;
INTO CURSOR temp_area_sum
IF _TALLY > 0 AND !ISNULL(temp_area_sum.area_sum)
oTable.Cell(nRow, nCol).Range.Text = ALLTRIM(STR(temp_area_sum.area_sum, 10, 2))
ELSE
oTable.Cell(nRow, nCol).Range.Text = " "
ENDIF
nCol = nCol + 1
USE IN temp_area_sum
ENDSCAN
* 计算产品合计
SELECT SUM(金额) AS product_sum FROM temp_data ;
WHERE ALLTRIM(产品) == lcProduct ;
INTO CURSOR temp_product_sum
IF _TALLY > 0 AND !ISNULL(temp_product_sum.product_sum)
oTable.Cell(nRow, nCols).Range.Text = ALLTRIM(STR(temp_product_sum.product_sum, 10, 2))
ELSE
oTable.Cell(nRow, nCols).Range.Text = "0.00"
ENDIF
nRow = nRow + 1
USE IN temp_product_sum
ENDSCAN
* 添加总计行
oTable.Cell(nRows, 1).Range.Text = "总计"
* 计算每个区域的总计
SELECT cur_areas
nCol = 2
SCAN
lcArea = ALLTRIM(区域)
SELECT SUM(金额) AS area_total FROM temp_data ;
WHERE ALLTRIM(区域) == lcArea ;
INTO CURSOR temp_area_total
IF _TALLY > 0 AND !ISNULL(temp_area_total.area_total)
oTable.Cell(nRows, nCol).Range.Text = ALLTRIM(STR(temp_area_total.area_total, 10, 2))
ELSE
oTable.Cell(nRows, nCol).Range.Text = "0.00"
ENDIF
nCol = nCol + 1
USE IN temp_area_total
ENDSCAN
* 计算整体总计
SELECT SUM(金额) AS grand_total FROM temp_data INTO CURSOR temp_grand
IF _TALLY > 0 AND !ISNULL(temp_grand.grand_total)
oTable.Cell(nRows, nCols).Range.Text = ALLTRIM(STR(temp_grand.grand_total, 10, 2))
ELSE
oTable.Cell(nRows, nCols).Range.Text = "0.00"
ENDIF
* 关闭Excel
oWorkbook.Close(.F.)
oExcel.Quit()
* 保存Word文档
oDoc.SaveAs(FileName)
* 清理对象
RELEASE oSheet, oWorkbook, oExcel
RELEASE oTable, oDoc, oWord
USE IN temp_data
USE IN cur_areas
USE IN cur_products
USE IN temp_grand
MESSAGEBOX("Word格式的销售统计表生成完成!", 64, "完成")








程序代码:
