मैं अजगर का उपयोग करके एक्सेल में चार्ट के लिए बाहरी डेटा लिंक को अपडेट करने का प्रयास कर रहा हूं। चार्ट workbook1.xlsm में बैठता है और जिस डेटा को यह अपडेट करने के लिए संदर्भित करता है वह external_workbook.xlsx में बैठता है। अलग होने का कारण यह है कि डेटा को समय-समय पर अजगर का उपयोग करके workbook1.xlsm में अपडेट करना पड़ता है, जो चार्ट को मिटा देता है यदि वह workbook1.xlsm में है।

मैंने विभिन्न समाधानों को देखा है लेकिन अब तक मेरे लिए कोई भी काम नहीं कर रहा है। मैंने अब तक जिन दो समाधानों का प्रयास किया है उनमें (1) प्रोग्रामेटिक रूप से कार्यपुस्तिका को रीफ्रेश करना और (2) प्रोग्रामेटिक रूप से रीफ्रेश करने के लिए कार्यपुस्तिका में मैक्रो चलाना शामिल है।

(1) के लिए कोड:

import win32com.client as w3c
xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
xlapp.Visible = 0
xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
time.sleep(5)
xlwb.Save()
xlapp.Quit()

(2) के लिए कोड:

# ***************** #
# Excel macro - I've verified the macro works when I have the worksheet open.
Sub Update_Links()
    ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
End Sub
# ***************** #

import win32com.client as w3c
xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
xlapp.Visible = 0
xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
xlwb.Application.Run("{}!Module1.Update_Links".format(fname)) # Runs with no errors, but doesn't refresh
xlwb.Save()
xlapp.Quit()

एक्सेल में मेरे चार्ट की श्रृंखला है

# External data link for Excel chart #
=SERIES(,'...path_to_external_file...[external_workbook.xlsx]Sheet1'!$A$2:$A$2000,
'...path_to_external_file...[external_workbook.xlsx]Sheet1'!$F$2:$F$2000,1)

क्या कोई मुझे यह काम करने का वैकल्पिक समाधान प्रदान कर सकता है?

संपादित करें

इसलिए मैंने इसका परीक्षण करने के लिए कुछ आसान करने की कोशिश की। मैंने workbook1.xlsm में temp नामक एक नई शीट बनाई और नीचे दिए गए कोड का उपयोग करके सेल A1 में एक यादृच्छिक मान लिखने का प्रयास किया। कोड चलाने के बाद भी अस्थायी पत्रक खाली है।

import win32com.client as w3c
import random

xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
xlapp.Visible = 0
xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
books = w3c.Dispatch(xlwb) 

sheet_temp = books.Sheets('temp')
sheet_temp.Cells(1,1).Value = random.random()

xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
time.sleep(5)
xlwb.Save()
xlapp.Quit()

मुझे कोड में कोई त्रुटि नहीं मिलती है और अन्य लोगों द्वारा ऑनलाइन पोस्ट किए गए उदाहरणों का अनुसरण कर रहा हूं। क्या कोई मुझे इंगित कर सकता है कि मैं इसके साथ गलत कहां जा रहा हूं?

0
Alex F 17 जिंदा 2019, 17:25

1 उत्तर

सबसे बढ़िया उत्तर

इसका उत्तर यह है कि workbook1.xlsm को अपडेट करने से पहले मुझे कार्यपुस्तिका को खोलने की आवश्यकता है external_workbook.xlsx, ताकि डेटा को ताज़ा किया जा सके।

कार्य कोड इस प्रकार है:

import win32com.client as w3c
import random

xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
xlapp.Visible = 0

# ********************************* #
# New line that fixes it #
xlwb_data = xlapp.Workbooks.Open(r'{}\{}'.format(path, 'external_workbook.xlsx'), False, True, None)
# ********************************* #

xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, 'workbook1.xlsm'), False, True, None)
books = w3c.Dispatch(xlwb) 

sheet_temp = books.Sheets('temp')
sheet_temp.Cells(1,1).Value = random.random()

xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
time.sleep(5)
xlwb.Save()
xlapp.Quit()
0
Alex F 18 जिंदा 2019, 20:38