سؤال

ما أحاول تحقيقه

  • يقوم تطبيقي بإنشاء بعض البيانات الجدولية
  • أريد أن يكون المستخدم قادرًا على تشغيل Excel والنقر فوق "لصق" لوضع البيانات كخلايا في Excel
  • يقبل Windows تنسيقًا يُسمى "CommaSeparatedValue" يُستخدم مع واجهات برمجة التطبيقات الخاصة به، لذا يبدو هذا ممكنًا
  • يعمل وضع النص الخام في الحافظة، لكن محاولة استخدام هذا التنسيق لا تنجح
  • ملحوظة:يمكنني استرداد بيانات CSV من الحافظة بشكل صحيح، مشكلتي تتعلق بلصق بيانات CSV في الحافظة.

ما جربته لا يعمل

الحافظة.SetText()

System.Windows.Forms.Clipboard.SetText(  
  "1,2,3,4\n5,6,7,8", 
  System.Windows.Forms.TextDataFormat.CommaSeparatedValue
  );

الحافظة.SetData()

System.Windows.Forms.Clipboard.SetData(
  System.Windows.Forms.DataFormats.CommaSeparatedValue,
  "1,2,3,4\n5,6,7,8", 
  );

في كلتا الحالتين، يتم وضع شيء ما في الحافظة، ولكن عند لصقه في Excel فإنه يظهر كخلية واحدة من النص المهمل:"–§žý;pC¦yVk²ˆû"

التحديث 1:الحل البديل باستخدام SetText()

كما يظهر إجابة BFree نص مجموعة مع TextDataFormat بمثابة الحل البديل

System.Windows.Forms.Clipboard.SetText(  
  "1\t2\t3\t4\n5\t6\t7\t8", 
  System.Windows.Forms.TextDataFormat.Text
  );

لقد جربت ذلك وأؤكد أن اللصق الآن في Excel وWord يعمل بشكل صحيح.وفي كل حالة يتم لصقه كجدول يحتوي على خلايا بدلاً من النص العادي.

لا يزال من الغريب سبب وجود CommaSeparatedValue لا عمل.

هل كانت مفيدة؟

المحلول

أماكن .NET Framework DataFormats.CommaSeparatedValue في الحافظة كنص Unicode.ولكن كما ذكر في http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q, ، يتوقع Excel أن تكون بيانات CSV عبارة عن دفق ذاكرة UTF-8 (من الصعب تحديد ما إذا كان .NET أو Excel هو المتسبب في عدم التوافق).

الحل الذي توصلت إليه في تطبيقي الخاص هو وضع نسختين من البيانات الجدولية في الحافظة في وقت واحد كنص محدد بعلامات جدولة وكتدفق ذاكرة CSV.يتيح ذلك للتطبيق الوجهة الحصول على البيانات بالتنسيق المفضل له.يفضل برنامج Notepad وExcel النص المحدد بعلامات جدولة، ولكن يمكنك إجبار Excel على الحصول على بيانات CSV عبر لصق خاص...الأمر لأغراض الاختبار.

فيما يلي بعض الأمثلة على التعليمات البرمجية (لاحظ أنه يتم استخدام مكافئات WinForms من مساحات أسماء WPF هنا):

// Generate both tab-delimited and CSV strings.
string tabbedText = //...
string csvText = //...

// Create the container object that will hold both versions of the data.
var dataObject = new System.Windows.DataObject();

// Add tab-delimited text to the container object as is.
dataObject.SetText(tabbedText);

// Convert the CSV text to a UTF-8 byte stream before adding it to the container object.
var bytes = System.Text.Encoding.UTF8.GetBytes(csvText);
var stream = new System.IO.MemoryStream(bytes);
dataObject.SetData(System.Windows.DataFormats.CommaSeparatedValue, stream);

// Copy the container object to the clipboard.
System.Windows.Clipboard.SetDataObject(dataObject, true);

نصائح أخرى

استخدم علامات التبويب بدلاً من الفواصل.أي:

Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);

لقد اختبرت هذا بنفسي للتو، وقد نجح معي.

لقد نجحت في اللصق في Excel باستخدام (راجع إجابة BFree) كفواصل أعمدة و كفواصل صفوف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top