com调用excel后,进程未关闭解决方案
COM调用结束后,进程未关闭
1. c++ com
- C++直接调用com的,可以通过Application::GetHwnd()获取窗口句柄,之后通过窗口句柄获取进程pid,然后kill进程,参考下面函数LuaCloseWindow()内代码。
2. luacom
- 注册lua函数,在lua中调用该函数。
static int LuaCloseWindow(lua_State* L)
{
long hWnd = luaL_checkinteger(L, 1);
unsigned long dwPid = 0;
::GetWindowThreadProcessId((HWND)hWnd, &dwPid);
char cmdData[128] = { 0 };
sprintf_s(cmdData, "/c taskkill /F /PID %d /T", dwPid);
ShellExecute(NULL, "open", "cmd", cmdData, NULL, SW_HIDE);
return 0;
}
lua_register(L, "CloseWindow", LuaCloseWindow);
- 在lua代码中获取excel窗口句柄,调用CloseWindow()关闭进程
require('luacom')
local iconv = require('luaiconv')
local iconvGbk2Utf8 = iconv.new("utf-8", "gbk")
function gbk2utf8(str)
return iconvGbk2Utf8:iconv(str)
end
local iconvUtf82Gbk = iconv.new("gbk", "utf-8")
function utf82GBK(str)
return iconvUtf82Gbk:iconv(str)
end
function IsFileExists(path)
local file = io.open(path, "rb")
if file then file:close() end
return file ~= nil
end
-- 获取excel内容
function GetContent( strFilePath )
local excel = luacom.CreateObject("Excel.Application")
if excel == nil then
excel = luacom.CreateObject("Ket.Appplication")
end
assert(excel ~= nil, "Neither Excel nor WPS is installed. Please install and try again.")
excel.Visible = false
assert(IsFileExists(strFilePath),"\""..strFilePath.."\",No Such File! ")
strFilePath = gbk2utf8(strFilePath)
local book = excel.WorkBooks:Open(strFilePath,0,1) --ReadOnly open
assert(book ~= nil, "Open "..strFilePath.." Failed")
local sheet = book.ActiveSheet
assert(sheet ~= nil, "empty sheet!")
local nColCount =sheet.UsedRange.Columns.Count
local nRowCount =sheet.UsedRange.Rows.Count
local tbExcelData = {}
for nRow = 1, nRowCount do
local tbRowData = {}
for nCol = 1, nColCount do
local str = tostring(sheet.Cells(nRow,nCol).Value2)
str = utf82GBK(str)
str = string.gsub(str,"\n","")
if str == "nil" then
str = ""
end
table.insert(tbRowData,str)
end
table.insert(tbExcelData,tbRowData)
end
--close File
excel.DisplayAlerts = false
book:Close()
CloseWindow(excel.hWnd) --获取excel窗口句柄,通过excel句柄关闭进程
--[[
book:Close()
sheet = nil
book = nil
excel:Quit()
excel = nil
collectgarbage()
]]--
return tbExcelData,nRowCount,nColCount
end
luaDll,luacom,luaiconv下载,请点击这里
也可关注微信公众号回复“lua”获取。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律