VB.NET : DOCX : מדוע וורד נפתח לקריאה בלבד ?
-
לא ראיתי את כל הקוד ממש ואני גם לא יודע באיזו פונקציה אתה משתמש, אבל בכל אופן, צריך שיהיה באופן מפורש פקודת Close שמתיחחסת ישירות למסמך הוורד, אחרת הוא עדיין טעון ובשימוש של אותה התוכנית, כך שלפי כללי windows אסור ש 2 תהליכים ישתמשו באותו קובץ לעריכה, ועל כן הוא נפתח לקריאה בלבד.
בהצלחה.
תודה.
כיון שקובץ docx הוא בעצם ZIP משתמשים שם ב ספריה ICSharpCode.SharpZipLib.Zip
ואכן יש שם פקודה של Close לאחר כל שימוש בספריה זו.
יש פה עובדה מעניינת:
אם הקובץ כבר פתוח בוורד ואני בא לחלץ את הטקסט שלו אי אפשר לפתוח אותו עם הספריה הנ''ל והוא מודיע שקובץ בשימוש, אבל אם הקובץ לא פתוח בשום מקום ועשיתי לו חילוץ ושוב חילוץ זה עובד ואין הודעת שגיאה שהקובץ תפוס כלומר שהחילוץ הראשון לא השאיר את הקובץ תפוס אלא סגר אותו ולכן אפשר לחלץ שוב. אבל כאשר פותחים את הקובץ אחר החילוץ בוורד הוא נפתח לקריאה בלבד כאילו הקובץ תפוס, וגם וורד לא שואל כלל אם לפתוח לקריאה בלבד כמו שהוא נוהג כאשר הקובץ בשימוש אלא מיד פותח לקריאה בלבד.אודה לכם מאוד אם תעיינו בקוד הוא מאוד מאוד פשוט, רק צריך מומחה שיתפוס את הנקודה אם זו בעיה בקוד או בספריית ה ZIP או אולי בוורד עצמו.
פורסם במקור בפורום CODE613 ב25/07/2013 13:34 (+03:00)
-
לדעתי הבעיה היא לא קובץ בשימוש, אלא סימון כסופי וכדומה.
אתה יכול לבדוק זאת בקלות ע"י השוואת שני ה"חבילות" (הקבצים אחרי פתיחת ZIP).
ככלל, כשיש ספק אם בעיה מסויימת היא עקב שימוש של יישום אחר, העתקה של הקובץ פותרת את הספק.אבל, וה"אבל" הזה גדול, אני לא מבין מה ההוא מCodeproject יותר טוב מהשימוש בOpen XML.
לכן אני לא מבקש ממך להעלות את הקוד שלך, כי אני מקוה שבמקום להתעמק בשל ההוא, תשתמש עם הרשמי והמפורסם.
הנה ההורדה הרשמית: http://www.microsoft.com/en-us/download/details.aspx?id=5124
העיקר זה הקובץ הקטן, הוא הDLL. הגדול זה טוב ללמוד איך עובדים הקבצים מבוססי הOpenXml, מה הם מכילים ואיך לקרוא ולכתוב את זה.הנה מה שצריך לקריאת הטקסט כמדומני:
Dim Doc = Packaging.WordprocessingDocument.Open(filename, False) Return Doc.MainDocumentPart.Document.InnerText Doc.Close()
פורסם במקור בפורום CODE613 ב25/07/2013 15:38 (+03:00)
-
@דוד ל.ט.
לדעתי הבעיה היא לא קובץ בשימוש, אלא סימון כסופי וכדומה.
כוונתך שהמסמך הוורד מסומן כסופי? אבל הוא לא מסומן, והראיה שאחרי סגירת תוכנית חילוץ הטקסט הקובץ נפתח לעריכה כרגיל.
@דוד ל.ט.
אתה יכול לבדוק זאת בקלות ע"י השוואת שני ה"חבילות" (הקבצים אחרי פתיחת ZIP).
לא הבנתי למה כוונתך.
@דוד ל.ט.
ככלל, כשיש ספק אם בעיה מסויימת היא עקב שימוש של יישום אחר, העתקה של הקובץ פותרת את הספק.
דווקא אפשר להעתיק קובץ וורד גם בזמן שהוא פתוח בוורד ע''י הפקודה File.Copy. וכאשר אני רוצה לחלץ טקסט מקובץ וורד שפתוח בוורד אני לא יכול לפתוח אותו עם ספריית ZIP הנ''ל כי הוא מוציא שגיאה שהקובץ בשימוש ואז אני קודם מעתיק אותו לקובץ זמני ואז את הזמני אני פותח עם ZIP.
@דוד ל.ט.
אבל, וה"אבל" הזה גדול, אני לא מבין מה ההוא מCodeproject יותר טוב מהשימוש בOpen XML.
הקוד שלו נותן לך טקסט עם חלוקה לפסקאות אבל אם אתה תקח רק את ה Document.InnerText אתה תקבל את כל המילים דבוקות. דבר שהקוד שלו לא נותן זה הטקסט של ההערות שוליים והערות הסיום אבל את זה אני כבר הוספתי לבד.
אגב על אותה הדרך כתבתי קלאס שמחלץ טבלאות/גליונות מתוך xlsxפורסם במקור בפורום CODE613 ב25/07/2013 15:53 (+03:00)
-
נכון לא קראתי היטב את הודעתך ("רק לאחר סגירת התוכנית אפשר לפתוח"). אז טעיתי.
הבעיה היא בהחלט קובץ בשימוש. אני לא יכול להצביע על בעיה בלי שתיתן קוד. לך הייתי מציע לפתוח פרוייקט חדש וללכת שלב שלב בשימוש עם הספרייה, ולראות מה נועל את הקובץ.מה שלא הבנת לגבי השוואת חבילות זה כבר לא רלוונטי בגלל טעותי דלעיל. בכל אופן לפי מה שהייתי סבור שהקובץ ננעל לעולמים, אפשר לפתוח את הקבצים ידנית ולחפש הבדל בין נעול לבין שאינו.
בקשר להעתקת הקובץ שפותרת ספקות, גם כבר לא רלוונטי בגלל טעותי דלעיל. התכוונתי בדיוק למה שכתבת, שאחרי העתקה מנסים עם המועתק, ואז אם יש בעיה סימן שהבעיה איננה קובץ בשימוש. תנסה יותר להבין אותי להבא...
ובקשר לספריה שהצעתי לך:
אתה מתלונן שהיא נותן טקסט מופרד בין פסקאות. אמת. ידעתי זאת.
אבל אתה סבור שזה סיבה שלא להשתמש בה? לא יכולת לשאול איך רואים מופרד לפסקאות?
תגיד מה אתה רוצה ואיך אם אתה לא מסתדר איתה. אין דבר שא"א לעשות איתה. כולל באקסל וכל תוכנות האופיס.פורסם במקור בפורום CODE613 ב25/07/2013 16:28 (+03:00)
-
הנה קוד מעודכן למה שביקשת:
Dim Doc = Packaging.WordprocessingDocument.Open(filename, False) Dim tb As New Text.StringBuilder For Each P In Doc.MainDocumentPart.Document.Elements(Of Wordprocessing.Paragraph)() tb.Append(P.InnerText) tb.Append(vbCrLf) Next Doc.Close() Return tb.ToString()
פורסם במקור בפורום CODE613 ב25/07/2013 16:38 (+03:00)
-
@דוד ל.ט.
הנה קוד מעודכן למה שביקשת:
Dim Doc = Packaging.WordprocessingDocument.Open(filename, False) Dim tb As New Text.StringBuilder For Each P In Doc.MainDocumentPart.Document.Elements(Of Wordprocessing.Paragraph)() tb.Append(P.InnerText) tb.Append(vbCrLf) Next Doc.Close() Return tb.ToString()
משום מה הקוד הזה לא עובד הוא לא מזהה שום פיסקה במסמך, מה גם שה DLL שלו הוא חמש מגה! וכעת אני מחלץ את הטקסט מוורד ואקסל בפחות מ300 KB
פורסם במקור בפורום CODE613 ב25/07/2013 16:56 (+03:00)
-
הנה הפרוייקט המקורי כפי שפורסם:
DocxToText_demo.zipהקוד הוא מאוד פשוט וקצר אני מקווה שתגלו בקלות מה מונע את וורד לפתוח את הקובץ לעריכה.
תבורכו מפי עליון!פורסם במקור בפורום CODE613 ב25/07/2013 17:13 (+03:00)
-
נכון, בקוד שלי יש טעות, צריך להוסיף אחרי המילה Document. את המילה Body.
בקשר לגודל הDLL, אכן אם זה נושא בשבילך זה בעיה שיש לתת עליה את הדעת.
(ביחס למה שזה עושה, זה קטן, אבל אתה לא צריך את כל זה לעניין קריאה גרידא).אם אתה ממשיך עם הקוד ההוא עשה כעצתי ו"דבג" אותו צעד צעד.
פורסם במקור בפורום CODE613 ב25/07/2013 17:45 (+03:00)
-
הנה הפרוייקט המקורי כפי שפורסם:
הקוד הוא מאוד פשוט וקצר אני מקווה שתגלו בקלות מה מונע את וורד לפתוח את הקובץ לעריכה.
תבורכו מפי עליון!הסימפטום לא מפיע אצלי. תוך כדי צפייה הקובץ נגיש לגמרי גם לכתיבה.
פורסם במקור בפורום CODE613 ב25/07/2013 17:47 (+03:00)